2017-02-23 5 views
1

Я хотел бы повторно окурок someHandler.getStatus, но я получаю TypeError: Attempted to wrap getStatus which is already wrapped ..Можно ли заглушить метод дважды в рамках одного теста, чтобы возвращать разные результаты?

it('is a test', function() { 

    sandbox.stub(someHandler, 'getStatus', function(callback) { 
    callback(null, { 
     value: 1 
    }); 
    }); 

    sandbox.stub(someOtherHandler, 'doSomething', function(callback) { 
    callback(null); 
    }); 

    sandbox.stub(someHandler, 'getStatus', function(callback) { 
    callback(null, { 
     value: 0 
    }); 
    }); 
}); 

ответ

1

пытаются отслеживать звонки, используя внешнюю переменную. первый раз, когда он вызывается, возвращает первое значение и увеличивает счетчик. второй вызов (и все последующие вызовы), верните второе значение.

it('is a test', function() { 

    let callCount = 0 

    sandbox.stub(someHandler, 'getStatus', function(callback) { 
    callback(null, { 
     value: callCount++ == 0 ? 1 : 0 
    }); 
    }); 

    sandbox.stub(someOtherHandler, 'doSomething', function(callback) { 
    callback(null); 
    });  
}); 

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

2

У Sinon есть хороший API для обработки нескольких вызовов (stub.onCall (n);) к тому же прошитому методу.

Пример из stub api doc:

"test should stub method differently on consecutive calls": function() { 
    var callback = sinon.stub(); 
    callback.onCall(0).returns(1); 
    callback.onCall(1).returns(2); 
    callback.returns(3); 

    callback(); // Returns 1 
    callback(); // Returns 2 
    callback(); // All following calls return 3 
} 

Мы используем этот подход широко в наших тестах.

+0

отлично работал для меня:) –