开玩笑的spyOn方法

时间:2019-02-18 15:17:15

标签: javascript unit-testing jestjs

我有这样的玩笑测试

    import * as source from '../source
      ("Spy on a method", ()=>{
        const spy = jest.spyOn(source, 'toBeCalledOn')
        const result = source.entrypoint(0);
        expect(source.toBeCalledOn()).toHaveBeenCalled();
        })

在我的srcjs中

export const entrypoint = (input)=>{
    toBeCalledOn(input)
}


const toBeCalledOn =(input)=>{
    console.log();
}

我希望'toBeCalledOn'通过我的笑话测试,但我总是失败-

Expected toBeCalledOn toHaveBeenCalled but wasn't

如何使用jestspy来查看某个方法是否在某些条件下被调用,例如if语句?

如果我错了,请纠正我,但是仅检查该方法是否已被调用该方法的意义对我来说似乎很明显。

1 个答案:

答案 0 :(得分:2)

您必须期望在spyied函数上的断言而不是实际函数。

当您spy使用该函数时,实际的函数将永远不会调用。

import * as source from '../source'; #import source object or all functions inside of it

describe('Spy on a method', () => {
  it('toBeCalledOn to have been called', () => {
    const spy = jest.spyOn(source, 'toBeCalledOn')
    const result = source.entrypoint(0);
    expect(spy).toHaveBeenCalledTimes(1);
    expect(spy).toHaveBeenCalledWith(0);
  })
});

如果要测试条件,还必须覆盖由于该功能而发生的分支。

如果您有一个ifelse语句,那么您将必须编写2个测试。请参见下面的示例。

export const entrypoint = (input)=>{
  if(input !== 0){
    toBeCalledOn(input);
  }
}

const toBeCalledOn =(input)=>{
    console.log('logs something');
}

import * as source from '../source

describe('Spy on a method', () => {
  it('toBeCalledOn not to be called', () => {
    const spy = jest.spyOn(source, 'toBeCalledOn')
    const result = source.entrypoint(0);
    expect(spy).not.toHaveBeenCalled();
  });
  
  it('toBeCalledOn to have been called', () => {
    const spy = jest.spyOn(source, 'toBeCalledOn')
    const result = source.entrypoint(1);
    expect(spy).toHaveBeenCalledTimes(1);
    expect(spy).toHaveBeenCalledWith(1);
  });
});

正在回答您的其他查询, 我要说的是,我们必须assert显而易见的事情。 如果有人对代码进行了更改,并且破坏了先前的流程,在这种情况下,您可以在测试用例中捕获错误。

这就是我们编写测试用例的原因。

此外,请尝试添加严格的断言,以便进行可靠的测试。例如。可以使用toHaveBeenCalled函数代替toHaveBeenCalledTimes来使断言更加严格。