我想对使用辅助类的角度组件进行单元测试。辅助类及其功能不应成为该测试的一部分,而应被模拟。 该组件可能如下所示:
import { MyHelperClass } from "./my-helper-class";
export class MyComponent {
public doStuff() {
const helper = new MyHelperClass();
if (helper.check()) {
// code I want to test
}
}
}
我想从单元测试中排除helper.check()
的功能,只是假设它返回true
(或者在第二次测试中为false)。所以我希望我的测试看起来像这样:
it("#doStuff should do something, assuming helper.check() is true, () => {
// make constructor of MyHelperClass return a Mock
// (or somehow spy on helper.check() and return true?)
expect(component.doStuff()).toBe(someValue);
});
答案 0 :(得分:0)
您可以设置一个间谍,该间谍可以模拟函数调用并返回check()
所需的任何值。它还可以让您检查该功能(例如,间谍实际上已被调用以及执行了多少次等)。
棘手的部分是,如果您没有该类的实例,则需要在该类的prototype
上设置间谍。
看看下面的代码(dummyVariable
只是一个变量,用于测试check()
之后的代码是否已执行):
it('doStuff should do something, assuming helper.check() is true', () => {
// test the before value
expect(component.dummyVariable).toBe(false);
// set up the spy and make it return true
const spy = spyOn(MyHelperClass.prototype, 'check').and.returnValue(true);
// call our function
component.doStuff();
// check the after value
expect(component.dummyVariable).toBe(true);
// check if our spy/mocked function was actually called
expect(spy).toHaveBeenCalledTimes(1);
});
// same thing as above but this time our spy returns false
it('doStuff should do something, assuming helper.check() is false', () => {
expect(component.dummyVariable).toBe(false);
const spy = spyOn(MyHelperClass.prototype, 'check').and.returnValue(false);
component.doStuff();
expect(component.dummyVariable).toBe(false);
expect(spy).toHaveBeenCalledTimes(1);
});
您可以找到一个有效的例子 here。