我有这样的玩笑测试
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
语句?
如果我错了,请纠正我,但是仅检查该方法是否已被调用该方法的意义对我来说似乎很明显。
答案 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);
})
});
如果要测试条件,还必须覆盖由于该功能而发生的分支。
如果您有一个if
和else
语句,那么您将必须编写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
来使断言更加严格。