Jasmine spyOn多次返回



我想用Jasmine测试我的angular应用程序。所以我创建了一些测试,其中大多数都很好。但是,我的一个功能需要用户填写一个提示。测试无法填充这个提示,所以我用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'

来监视

但这会产生以下错误:错误:提示已经监视

正确的方法是这样的:

var spy = spyOn(window, 'prompt');
...
spy.and.returnValue('test')
...
spy.and.returnValue('test2')

从jasmine v2.5开始,使用全局allowRespy()设置。

jasmine.getEnv().allowRespy(true);

当你不想和/或无法接触到第一个间谍时,你可以多次致电spyOn()。小心它会返回以前的间谍,如果有已经激活。

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

使用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')

相关内容

  • 没有找到相关文章

最新更新