2016-09-02 4 views
0

Рассмотрим следующую функцию:Sinon.js calledWithExactly() динамическое число аргументов

function MyClass(...); 
MyClass.prototype.funcToTest = function() { 
    var args = arguments; 
    ... 
} 

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

var obj = new MyClass(); 
sinon.spy(obj, 'funcToTest'); 
var args = [5, 3, 8]; 
MyClass.prototype.funcToTest.apply(obj, args); 
sinon.assert.calledWithExactly(obj.funcToTest, args); // Here's the problem 

Проблема в том, что это утверждают не удается, и я не уверен, why.ith?

ответ

0

* См. Мой второй комментарий к Всеволоду Головизнину. Я нашел решение, не знаю, если это лучший, но я создаю новый массив, чтобы перейти к утверждаете с функцией apply, как следующее:

var arr = [].slice.call(args, 0); 
arr.unshift(obj.funcToTest); 
sinon.assert.calledWithExactly.apply(null, arr); 
0

Есть два вопроса:

  • вы шпионить obj.funcToTest, но вы вызоваMyClass.prototype.funcToTest. Для целей этого теста это две разные вещи;
  • Утверждение проверяет, вызван ли метод вызванным с единственным аргументом, состоящим из массива, а не 3 аргументами;

Вот то, что работает:

var obj = new MyClass(); 
sinon.spy(obj, 'funcToTest'); 
var args = [5, 3, 8]; 
obj.funcToTest.apply(obj, args); 

sinon.assert.calledWithExactly.apply(sinon.assert, [ obj.funcToTest ].concat(args)) 

Или с закодированным списком аргументов:

sinon.assert.calledWithExactly(obj.funcToTest, 5, 3, 8); 
+0

Да, я полагал, что я должен использовать применить, я отправил ответ на этот вопрос. О шпионаже на obj.funcToTest и вызове MyClass.prototype.funcToTest, я не вижу проблемы, я уже писал тесты, которые заглушают функцию из прототипа, но я вызываю ее через экземпляр, и все же функция когда я называю это утверждениями синонов, отлично работает на нем – Jorayen

+0

@ Jorayen, если вы создаете экземпляр, а _then_ заглушите прототип, я не вижу, как он может работать. Однако это будет работать наоборот: заглушить прототип, а затем создать экземпляр. Но это не то, что показывал ваш примерный код. – robertklep

+0

да я более упростил свой пример. Я закрываю перед тем, как создать экземпляр в тестовой настройке, но это не было моей проблемой, поэтому я даже не упоминал об этом. – Jorayen