簡體   English   中英

使用 Sinon.js 測試一個函數調用 ES6 模塊中的另一個函數

[英]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 barbaz引用會根據本地實現進行解析。 您無法修改它,因為在模塊代碼之外無法訪問內部結構。

確實可以訪問導出的屬性,但您無法改變這些屬性,因此您無法影響模塊。

改變它的一種方法是使用這樣的代碼:

let obj = {};
obj.bar = function () {
 this.baz();
}

obj.baz = function() {
 ...
}

export default obj;

現在,如果您在導入的對象中覆蓋baz ,您影響bar的內部結構。

話雖如此,感覺相當笨拙。 存在其他控制行為的方法,例如依賴注入。

此外,您應該考慮是否真的關心baz被調用。 在標准的“黑盒測試”中,您不關心某事是如何完成的,您只關心它產生了哪些副作用。 為此,請測試您預期的副作用是否發生,並且沒有執行任何其他操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM