spyOn 和 createSpyObj 在同一规范 jasmine 中

问题描述 投票:0回答:1

我正在使用 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
unit-testing mocking jasmine spyon
1个回答
0
投票

当我们这样做时

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
方法将被监视并调用实际的方法。

© www.soinside.com 2019 - 2024. All rights reserved.