2015-06-01 2 views
2

Я пишу модульные тесты для своего модуля и использую SinonJS для проверки нескольких ожиданий относительно вызовов функций другим модулям. Во-первых, зарегистрировать макет для другого модуля:Различные аргументы/возвращаемые значения для ожидания sinon

var otherModule = { 
    getConfig : function() {} 
}; 

mockery.registerMock("otherModule", otherModule); 

Позже я несколько тестов и (успешно) проверить некоторые ожидания, такие как:

var otherModuleMock = sinon.mock(otherModule); 
otherModuleMock 
    .expects("getConfig") 
    .once() 
    .withArgs("A") 
    .returns(configValuesForA); 

// run test 

otherModuleMock.verify(); // <- succeeds 

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

otherModuleMock 
    .expects("getConfig") 
    .once() 
    .withArgs("A") 
    .returns(configValuesForA); 

otherModuleMock 
    .expects("getConfig") 
    .once() 
    .withArgs("B") 
    .returns(configValuesForB); 

из моего понимания документации, это, вероятно, следует работать. Однако это приводит к следующей ошибке:

ExpectationError: Unexpected call: getConfig(A) 
    Expectation met: getConfig(A[, ...]) once 
    Expectation met: getConfig(B[, ...]) once 

Я попытался заменить once() с atLeast(1) или удалить его полностью. Я также попытался уловить ожидаемое возвращение otherModuleMock.expect("getConfig") и применить вместо этого withArgs и returns. Оба безрезультатно.

Довольно уверен, что я использую mock() таким образом, каким я не должен, но как мне отсюда идти?

ответ

0

Выключает модуль, который я тестировал, фактически звонит getConfig 3 раза: один раз с A, один раз с B, а затем с A.

И, судя по всему, Sinon отслеживает порядок всех ожиданий/звонков, из-за чего тест даже провалился при использовании atLeast(1) вместо once(). Имеет смысл, когда я смотрю на это сейчас, но эти случаи на самом деле не документированы широко в документах Sinon (в моей собственной защите).