2014-05-01 6 views
3

Я хотел бы проверить, что определенная функция вызывается определенным образом на моем JavaScript-сервере на стороне сервера. Я использую Sinon mocks и stub. Sinon имеет методArgs(), чтобы проверить, вызвана ли функция с определенными аргументами. Можно ли использовать этот метод с помощьюArgs(), если я передаю большую комплексную функцию обратного вызова в качестве одного из аргументов?sinon.js с функцией обратного вызоваArgs

var foo = function(){ method: function() {}}; 
// use: foo.method(function(){ console.log('something') }); 
var spy = sinon.spy(foo, 'method'); 
spy.withArgs(???); 

ответ

2

Ваш пример немного сбивает с толку, потому что вы определили foo как функцию, но комментарий, который следует звонки foo.method():

var foo = function(){ method: function() {}}; 
// use: foo.method(function(){ console.log('something') }); 

В любом случае, «большой комплексная функция обратного вызова» это просто объект. withArgs возвращает объект-шпион, который фильтруется данными аргументами, и вы можете использовать функцию как часть этого фильтра. Например:

var arg1 = function() { /* large, complex function here :) */ }; 
var arg2 = function() {}; 
var foo = { 
    method: function() {} 
}; 
var spy = sinon.spy(foo, 'method'); 
foo.method(arg1); 
foo.method(arg2); 
console.assert(spy.calledTwice); // passes 
console.assert(spy.withArgs(arg1).calledOnce); // passes 
console.assert(spy.withArgs(arg1).calledWith(arg1)); // passes 
console.assert(spy.withArgs(arg1).calledWith(arg2)); // fails, as expected 

JSFiddle

+0

Престола, я бы perefer не использовать комплексную функцию в тестах. –

+0

Можете ли вы использовать шпион или заглушку вместо этого? – psquared

+0

JavaScript, будучи динамичным, способ, которым я в настоящее время занимаюсь этим, - это ступнение. Без использования sinon.js или любой другой структуры - я просто переписываю комплексный обратный вызов, чтобы выполнить минимальную функциональность и установить некоторые внутренние флаги тестирования. Итак, мое текущее решение находится за пределами sinon.js. –