我正在使用 Jasmine 来测试这个
class X{
test(obj){
return obj.someFunction()+100
}
}
所以我的规格是
it("test if someFunction is called and return value calculated correctly",()=>{
let x = new X()
let mockObj= jasmine.createSpyObj(["someFunction"])
mockObj.someFunction.and.callFake(()=> 2000)
let returnValue= x.test(mockObj)
expect (mockObj.someFunction).toHaveBeenCalled()
expect (returnValue).toBe(2000+100)
})
这没关系 现在我想检查 test() 的参数是否是一个对象作为数据类型 所以我想这样做
spyOn(x,"test")
let mockObj= jasmine.createSpyObj(["someFunction"])
x.test(mockObj)
expect(x.test.calls.allArgs()[0][0]).toBeInstanceOf(Object)
这在另一个 it() 中也可以
但是为什么我们不能在同一个 it() 块中同时执行这两项操作? 在同一个it()块中使用spyOn()和createSpyObj()是无效的吗?
如果我这样做,it()将会失败! 这是错误我遇到了
Expected spy unknown.someFunction to have been called
Expected undefined to be 2100
当我们这样做时
spyOn
,我们在方法上附加了一个间谍并放弃了它的实现细节。因此,在我们监视 test
方法之后,我们可以看到它被调用了多少次、如何调用等等,但我们丢失了它的实现细节(方法内部的内容)。
为了两全其美(仍然有实现细节并知道它是否被调用,如何调用等),我们需要使用
.and.callThrough();
。
像这样更改第一行:
// add .and.callThrough() here.
spyOn(x,"test").and.callThrough();
let mockObj= jasmine.createSpyObj(["someFunction"])
x.test(mockObj)
expect(x.test.calls.allArgs()[0][0]).toBeInstanceOf(Object)
这样,
test
方法将被监视并调用实际的方法。