2016-03-01 35 views
0

背景使用Sinon.JS和Rewire時可以設置`this`的值嗎?

如果我有以下模塊:

this_module: { 

    foo: {}; 

    set_this_foo: function() { 

     this.foo.boo = 'something'; 
     return this.foo; 
    } 
} 

,並使用Rewire導入私有函數,然後單元測試這個功能使用Sinon.js

var set_this_foo = app.__get__('this_module.set_this_foo'); 
var spy = sinon.spy(set_this_foo); 

spy(); 

expect(spy).to.have.returned({boo: 'something'}); 

我得到的錯誤消息:

TypeError: Cannot set property 'boo' of undefined

,因爲this最終具有全局對象的值。我可以通過在運行測試之前定義一個名爲foo的全局變量來解決此問題,但不希望污染全局名稱空間。

問題

是否有一個(優雅的)的方式的this相對值來定義到spy()

回答

1

我會做這個有點不同:

var myModule = app.__get__('this_module'); 
var spy  = sinon.spy(myModule, 'set_this_foo'); 

myModule.set_this_foo(); 

expect(spy).to.have.returned({ boo : 'something' }); 

既然你也可以使用原來的方法名(除了剛剛spy),調用指間諜,這將確保它被稱爲在正確的上下文。

+0

太棒了!非常感謝你。 – rabbitco

相關問題