我想用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'
答案 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')