Jasmine spyOn有多个回报

时间:2015-06-08 10:53:51

标签: javascript angularjs coffeescript jasmine

我想用Jasmine测试我的角度应用程序。 所以我创建了一些测试,其中大部分工作正常。 但是,我的一个功能要求用户填写提示。 测试无法填写此提示,因此我使用spyOn(window,'prompt').and.returnValue('test')模拟了它们。这有效,但只有一次。

当我添加两个组件(提示所在的函数)时,我希望spyOn第一个提示结果为'test',第二个提示符为'test2'。我尝试这样做如下:

it 'should place the component as last object in the form', ->

      spyOn(window, 'prompt').and.returnValue('test')
      builder.addFormObject 'default', {component: 'test'}

      spyOn(window, 'prompt').and.returnValue('test2')
      builder.addFormObject 'default', {component: 'test2'}

      expect(builder.forms['default'][0].name).toEqual('test')

但是这会出现以下错误:Error: prompt has already been spied upon 这很合乎逻辑,但我不知道用spyOn返回的另一种方法。

所以,我想要的是: 在第一个addFormObject之前,我想监视返回'test'的提示符。第二个addFormObject我想监视返回'test2'

3 个答案:

答案 0 :(得分:4)

  

但是这会出现以下错误:错误:提示已经存在   发现了

正确的方法就是:

var spy = spyOn(window, 'prompt');

...
spy.and.returnValue('test')

...
spy.and.returnValue('test2')

答案 1 :(得分:1)

使用spyOn,您可以返回模拟值并动态设置,如下面的代码

it 'should place the component as last object in the form', ->
  mockedValue = null

      spyOn(window, 'prompt').and.returnValue(mockedValue)
      mockedValue = 'test'
      builder.addFormObject 'default', {component: 'test'}

      mockedValue = 'test2'
      builder.addFormObject 'default', {component: 'test2'}

      expect(builder.forms['default'][0].name).toEqual('test')

答案 2 :(得分:1)

自jasmine v2.5起,请使用全局allowRespy()设置。



jasmine.getEnv().allowRespy(true);




当您不想和/或有权访问第一个间谍时,您可以多次致电spyOn()。请注意,如果有任何已经激活的间谍,它将返回上一个间谍。



spyOn(window, 'prompt').and.returnValue('test')
...
spyOn(window, 'prompt').and.returnValue('test')