Har*_*hah 4 jasmine typescript karma-jasmine angular angular-test
我有以下角度服务及其茉莉花测试。测试调用 f1() 并监视 f2()。函数 f2 接受变量 v2 并修改它(将字段 a 设置为 3)。函数 f2 应该用 v2 调用(如 f1 中声明的那样),但我的测试在toHaveBeenCalledWith 上失败,并说实际调用是在 f2 函数调用之后使用对象进行的。jasmine 是否在函数调用后匹配 .toHaveBeenCalledWith 的参数,这不应该是推荐的方式,或者我在这里犯了一些错误。
服务:
export class JasmineTestClass{
constructor(){
}
f2(v2){
v2.a = 3
};
f1(v1){
let v2 = {
a:30
};
this.f2(v2);
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
describe('Test', () => {
let service: JasmineTestClass;
beforeEach(() => {
service = new JasmineTestClass();
spyOn(service, 'f2').and.callThrough();
});
let v1 = {
a:2, b:3
};
let v2 = {
a:30
};
it('should succeed', () => {
service.f1(v1);
expect(service.f2).toHaveBeenCalledWith(v2); //this is failing
});
})
Run Code Online (Sandbox Code Playgroud)
日志:
Test should succeed FAILED
Expected spy f2 to have been called with [Object ({a:30})] but actual calls were [Object ({a:3})]
Run Code Online (Sandbox Code Playgroud)
请注意,我在测试时确实在 Chrome 中进行了调试,并且函数 f2() 是使用 v2 = {a:30} 调用的。
toHaveBeenCalledWith 在断言时匹配调用参数。
Jasmine 间谍只是在内部保存参数引用。调用参数可以通过日志service.f2.calls.all()对象进行跟踪。
这里的问题是f2修改通过引用传递给它的对象。调用后的任何地方都不存在原始v2与。v2.a === 30f2
对于这种情况,正确的策略是创建细粒度的测试,每个单元(方法)一个测试。使用的事实callThrough表明单元之间没有相互隔离spyOn(service, 'f2'),默认情况下只使用存根是个好主意:
it('should succeed', () => {
service.f1(v1);
expect(service.f2).toHaveBeenCalledWith({ a:30 });
});
it('should succeed', () => {
const obj = { a:30 };
service.f2(obj);
expect(obj).toEqual({ a:3 });
});
Run Code Online (Sandbox Code Playgroud)
现在我们正在测试这两种方法究竟发生了什么。
| 归档时间: |
|
| 查看次数: |
11809 次 |
| 最近记录: |