2016-10-04 45 views
2

我想在一個文件中單元測試一個函數,同時在SAME文件中存儲另一個函數,但這個模擬沒有被應用,並且真正的方法被調用。這裏有一個例子:使用Sinon在同一個文件中存根方法

// file: 'foo.js' 

export function a() { 
    // ..... 
} 

export function b() { 
    let stuff = a(); // call a 
    // ...do stuff 
} 

而且我的測試:

import * as actions from 'foo'; 

const aStub = sinon.stub(actions, 'a').returns('mocked return'); 
actions.b(); // b() is executed, which calls a() instead of the expected aStub() 
+0

作爲一個一般的經驗法則,你不應該在你正在測試的同一個模塊中對一個函數進行樁/嘲。如果你發現你需要這樣做,這是一個很好的跡象表明這兩個函數實際上應該在不同的模塊中。當然,雖然規則被打破,有些情況下這可能是好的,但總的來說,你應該避免。 –

回答

3

一些重組可以使這項工作。

我已經使用commonJS語法。在ES6中也應該以相同的方式工作。

foo.js

const factory = { 
    a, 
    b, 
} 
function a() { 
    return 2; 
} 

function b() { 
    return factory.a(); 
} 

module.exports = factory; 

test.js

const ser = require('./foo'); 
const sinon = require('sinon'); 

const aStub = sinon.stub(ser, 'a').returns('mocked return'); 
console.log(ser.b()); 
console.log(aStub.callCount); 

輸出

嘲笑返回

1

雖然上面的工作,它絕對是一個解決方法,因爲我的棉絨快速通知。

我結束了分離模塊和使用proxyquire。這個庫允許你輕鬆地用你選擇的任何/所有輸出,包括sinon stub spy或mocks來代替。例如:

在b.js

export const fnB =() => 'hey there!'; 

在a.js

import { fbB } from 'b.js'; 
export const fnA =() => fbB(); 

在a.test.js

import { noCallThru } from 'proxyquire'; 
const proxyquireStrict = noCallThru(); 
const stubB = stub().returns('forced result'); 
const moduleA = proxyquireStrict('a.js', { 
    'b.js' : { fnB: stubB } 
}).fnA; 

console.log(fnA()); // 'forced result' 
相關問題