[英]Test that a function calls another function in an ES6 module with Sinon.js
我想測試 ES6 模塊中的函數是否使用 Sinon.js 調用另一個函數。 這是我正在做的基本布局:
foo.js
export function bar() {
baz();
}
export function baz() {
...
}
測試.js
import sinon from 'sinon';
import * as Foo from '.../foo';
describe('bar', function() {
it('should call baz', function() {
let spy = sinon.spy(Foo, 'baz');
spy.callCount.should.eql(0);
Foo.bar();
spy.calledOnce.should.eql(true);
});
});
但是間諜沒有接聽baz()
的電話。 有沒有其他方法可以設置模塊或測試以允許 sinon 選擇它? 我的替代方案是對 baz 所做的事情做出一些基本的斷言,但我顯然不想那樣做。
從我在網上看到的情況來看,我想知道這是否可以通過按原樣布置的代碼實現,或者我是否需要對其進行重組以獲得我想要的。
您認為這對於模塊當前的結構方式是不可能的,這是正確的。
執行代碼時, function bar
的baz
引用會根據本地實現進行解析。 您無法修改它,因為在模塊代碼之外無法訪問內部結構。
您確實可以訪問導出的屬性,但您無法改變這些屬性,因此您無法影響模塊。
改變它的一種方法是使用這樣的代碼:
let obj = {};
obj.bar = function () {
this.baz();
}
obj.baz = function() {
...
}
export default obj;
現在,如果您在導入的對象中覆蓋baz
,您將影響bar
的內部結構。
話雖如此,感覺相當笨拙。 存在其他控制行為的方法,例如依賴注入。
此外,您應該考慮是否真的關心baz
被調用。 在標准的“黑盒測試”中,您不關心某事是如何完成的,您只關心它產生了哪些副作用。 為此,請測試您預期的副作用是否發生,並且沒有執行任何其他操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.