2013-12-19 3 views
3

Внутри модульного теста Я хочу проверить, звонит ли SUT require с определенным параметром. В основном мой SUT небольшой модуль со следующей реализацией:Шпион по требованию в Node.js

module.exports = function() { 
    require('foo'); 
}; 

теперь я хочу написать тест, как это:

var sut = require('./sut'); 
it('requires foo.', function() { 
    sut(); 
    expect(???); 
}); 

Таким образом, вопрос: Как я могу проверить, является ли require была вызвана с правильные параметры? Я попробовал это с помощью шпиона Sinon.js:

var spy = sinon.spy(require); 
sut(); 
expect(spy.callCount).to.be.equal(1); 
expect(spy.calledWithExactly('foo')).to.be(true); 
require.restore(); 

Но это не работает. Когда я запускаю мой тест, мокко говорит мне:

Error: expected 0 to equal 1

Что я делаю не так, и как я могу это исправить?

PS: Мне не нужен для работы с Sinon.js, поэтому, если другой модуль лучше подходит для моего дела, все остальное в порядке.

ответ

3

Существует модуль под названием proxyquire, с которым вы можете переопределить зависимости для блока purpopses тестирования: https://npmjs.org/package/proxyquire

Ваш аппарат тест может выглядеть следующим образом:

var proxyquire = require('proxyquire'); 

var sut = proxyquire('./sut', { 'foo': function(){ /* insert test code here */ }); 

Я не уверен, если это точно, что вы хотите, но, может быть, вы найдете это полезным.

+0

proxyquire было бы здорово, если бы я хотел его в течение всего времени, - но мне просто нужно это для одного теста. С proxyquire у меня нет возможности переконфигурировать это для каждого теста, к сожалению. Итак, следовательно: Хороший намек, но не соответствующий моему сценарию. –

1

Вы можете попробовать rewire. Это дает вам частный доступ к модулям для целей тестирования. Затем вы можете проверить module.children -переменная, чтобы проверить зависимость.

Учитывая вы хотите проверить, если модуль a.js требует b.js это будет выглядеть так:

var rewire = require("rewire"); 
var a = rewire("./a.js"); // using rewire instead of require 

var pathToB = require.resolve("./b.js"); 
var aModule = a.__get__("module"); // leaking the private module-variable 

assert.ok(aModule.children.some(function (module) { 
    return module.filename === pathToB; 
})); 
+0

Я только что узнал, что 'b.js' не должен находиться в' require.cache', иначе он не появится в 'children'-array. –

+0

Если 'require (" ./b.js ")' не происходит при запуске модуля, вы можете ввести собственный 'require()' через 'a .__ set __ (" require ", requireMock)' –

Смежные вопросы