Tôi đang sử dụng Mocha với Sinon để kiểm tra đơn vị mô-đun node.js của tôi. Tôi đã chế nhạo thành công các phụ thuộc khác (các mô-đun khác mà tôi đã viết), nhưng tôi đã gặp phải các vấn đề nảy sinh các chức năng không thuần túy (như Math.random()
và Date.now()
). Tôi đã thử những điều sau đây (đơn giản hóa để câu hỏi này không được bản địa hóa), nhưng Math.random()
không bị bướng bỉnh vì một vấn đề phạm vi rõ ràng. Các phiên bản Math
độc lập giữa tệp thử nghiệm và mymodule.js
.Stubbing Date.now() và Math.random()
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
});
});
});
Vì vậy, trong ví dụ contrived này, functThatDependsOnRandom()
sẽ trông như thế:
mymodule.js
var other = require('./other.js');
function funcThatDependsOnRandom(num) {
if(typeof num === 'undefined') num = Math.random();
return other.otherFunc(num);
}
Có thể còn sơ khai Math.random()
trong kịch bản này với Sinon?
Câu trả lời hay. Bạn có thể sử dụng proxyquire thay vì nhạo báng quá. – Wtower