Използвам Mocha с Sinon за модулен тест на модулите ми node.js. Успешно се подиграх на други зависимости (други модули, които съм написал), но се натъкнах на проблеми при зарязване на нечисти функции (като Math.random()
и Date.now()
). Опитах следното (опростено, така че този въпрос да не е толкова локализиран), но Math.random()
не беше блокиран поради очевиден проблем с обхвата. Екземплярите на Math
са независими между тестовия файл и mymodule.js
.
test.js
var sinon = require('sinon'),
mymodule = require('./mymodule.js'),
other = require('./other.js');
describe('MyModule', function() {
describe('funcThatDependsOnRandom', function() {
it('should call other.otherFunc with a random num when no num provided', function() {
sinon.mock(other).expects('otherFunc').withArgs(0.5).once();
sinon.stub(Math, 'random').returns(0.5);
funcThatDependsOnRandom(); // called with no args, so should call
// other.otherFunc with random num
other.verify(); // ensure expectation has been met
});
});
});
Така че в този измислен пример functThatDependsOnRandom()
ще изглежда така:
mymodule.js
var other = require('./other.js');
function funcThatDependsOnRandom(num) {
if(typeof num === 'undefined') num = Math.random();
return other.otherFunc(num);
}
Възможно ли е да заглушите Math.random()
в този сценарий със Sinon?