2016-07-08 2 views
3

У меня есть функция:Использование SinonJS заглушки (с ReWire)

var publish = function(a, b, c) { 
    main = a + getWriterName(b,c); 
} 

и getWriterName другая функция:

var getWriterName = function(b,c) { 
    return 'Hello World'; 
} 

Я хочу, чтобы проверить функцию «опубликовать», но я не хочу запустите функцию getWriterName, пока я тестирую «publish». Мне кажется, что я блокирую функцию getWriterName, потому что я не хочу запускать ее каждый раз, когда я тестирую «публиковать», но как мне это сделать? Я сделал что-то вроде:

var sandbox = sinon.sandbox.create(); 
sandbox.stub(getWriterName).returns('done'); 

Но это дает мне ошибку

TypeError: Attempted to wrap undefined property undefined as function

Что случилось с моими заглушками, если я нахожусь в пути записи?

Edit: Я использую перемонтировать так хотелось решения с использованием перемонтировать

ответ

0

Это решило мою проблему:

Если мои функции находятся в файле с именем main.js затем во-первых, я бы переделал файл как:

var main = rewire('main'); 

Затем, чтобы заглушить любую другую функцию, вызываемую в одна функция, в моем случае, когда я должен был окурок getWriterName я хотел бы сделать:

main.__set__('getWriterName', function(b, c) { 
    return 'Something Else' 
} 

и, наконец, после окончания его использования, сделайте

main.restore(); 
0

От Sinon Docs: «Метод sinon.sandbox.create(config) в основном это функция интеграции, а также в качестве конечного пользователя Sinon.JS вы, вероятно, не нужно Это."

Обычно вы создаете Sinon заглушки с синтаксисом:

sinon.stub(obj, 'property, function(){ 
     //do something 
} 

Допустим, что где-то в вашем файле вы экспортируете эти две функции

//somefile.js 
var publish = function(a, b, c) { 
    main = a + getWriterName(b,c); 
} 

var getWriterName = function(b,c) { 
    return 'Hello World'; 
} 
exports.getWriterName = getWriterName; 
exports.publish = publish; 

импортируя их в тестах:

var someFile = require('./somefile.js'); 

И попытаться заглушить метод, который вы хотели бы:

sinon.stub(someFile, 'getWriterName', function(b, c) { 
    return 'done' 
}); 

Вы обнаружите, что это тоже не сработает. Это связано с тем, что синон не может на самом деле исключить метод, который требуется, если только он не может получить к нему доступ как свойство требуемого файла. Для того, чтобы это работало, вы должны делать это:

//somefile.js

var getWriterName = function(b,c) { 
    return 'Hello World'; 
} 
exports.getWriterName = getWriterName; 

var publish = function(a, b, c) { 
    main = a + exports.getWriterName(b,c); 
} 
exports.publish = publish; 

Теперь getWriterName доступен для гася как только вы импортировать файл с функциями в ваш тесты.Вы бы сделать это так же, как выше примере:

sinon.stub(someFile, 'getWriterName', function(b, c) { 
    return 'done' 
}); 

И может отменить его:

someFile.getWriterName.restore(); 
+0

Прошу прощения, я хотел получить решение с использованием rewire, а не требовать –

1

Это как Sinon может быть использован с Rewire для заглушите функцию. Перепродажа в этом случае особенно полезна, если оштукатуренная функция является частной.

it('getWriteName always returns "Hello World"', function() {  
    var stub = sandbox.stub(); 
    stub.returns('Hello World'); 
    var unset = log.__set__('getWriterName', stub); 

    // your test and expectations here 

    unset(); 
    // it's always good to restore the previous state 
}); 
Смежные вопросы