2013-06-24 53 views
0

我正在为我的Backbone缓存编写使用Jasmine的单元测试,并试图使用Sinon.js模拟函数响应。对于不同的测试,我预计会发生不同的事情,所以我在每次测试之前创建一个模拟并删除它,然后在测试本身内填充行为。但是,我收到错误并且测试失败。试图包装已经包装的sendRequest

这里是我的规格只有相关测试(其它测试不使用模拟):

describe("mysite.core.Cache.XFooInfo", function() { 
    var fnMock; 

    beforeEach(function() { 
     fnMock = sinon.mock(fn); 
    }); 

    afterEach(function() { 
     delete fnMock; 
    }); 

    it("should make a request after function fooCreated called", function() { 
     fnMock.expects("sendRequest").once().withExactArgs("ModuleFoo", "getFoo", ["1000"]); 

     events.trigger("fooCreated", [{Args:[test.data.XFooInfo]}]); 
     fnMock.verify(); 
    }); 
}); 
describe("mysite.core.Cache.XFooBarInfo", function() { 
    var fnMock; 

    beforeEach(function() { 
     fnMock = sinon.mock(fn); 
    }); 

    afterEach(function() { 
     delete fnMock; 
    }); 

    it("should make a request after function booUpdated called", function() { 
     var booCopy = $.extend(true, {}, test.data.XBooInfo); 

     booCopy[0].Args[0].FooID = "12345"; 
     fnMock.expects("sendRequest").once().withExactArgs("ModuleFoo", "getFoo", ["12345"]); 

     events.trigger("booUpdated", booCopy); 
     fnMock.verify(); 
    }); 
}); 

的第一个测试工作正常,并通过。第二个测试,不过,给我这个错误:

TypeError: Attempted to wrap sendRequest which is already wrapped 
    at Object.wrapMethod (https://localhost:8443/mysite/web/tests/libs/sinon-1.7.1.js:528:23) 
    at Object.expects (https://localhost:8443/mysite/web/tests/libs/sinon-1.7.1.js:2092:27) 
    at null.<anonymous> (https://localhost:8443/mysite/web/shasta-cList-tests/spec/CacheSpec.js:909:15) 
    at jasmine.Block.execute (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:1024:15) 
    at jasmine.Queue.next_ (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:2025:31) 
    at jasmine.Queue.start (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:1978:8) 
    at jasmine.Spec.execute (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:2305:14) 
    at jasmine.Queue.next_ (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:2025:31) 
    at jasmine.Queue.start (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:1978:8) 
    at jasmine.Suite.execute (https://localhost:8443/mysite/web/tests/libs/jasmine-1.2.0.rc3/jasmine.js:2450:14) 

我找不到在Sinon.js文档什么告诉我什么,我做错了。我知道verify也对它所嘲笑的所有功能做了restore,我认为这足以让我为同一功能编写新的expects行为,但显然我错了。

这样做的正确方法是什么?

回答

2

好的,所以在上周五没有运气的情况下花了2个小时解决了这个问题之后,我在发布这个问题后20分钟就想出了它。将var fn.sendRequest = function(module, fnName, args) {};添加到beforeEach函数可修复所有失败的测试。

+1

删除变量是JS做一个奇怪的事情,它通常用来删除对象的一员,就像删除myobj.arbitraryAttribute; 另外你的评论有语法错误,你不能说var fn.sendRequest =任何东西。要么你说var identifier = something;或fn.sendRequest =某事。 所以我认为你有一些问题与普遍的js理解。一般来说,如果sinon抱怨对象已经被包装了,那么你需要在包装对象上调用.restore(),在你的情况下,在每次测试结束时。 –

0

这一个工程也少打字:

var fn.sendRequest = function() { };