我的方法接受 http.ServerResponse
并调用它的一些方法。正在查看Sinon's docs看来这应该是微不足道的。但是,如果我没有设置期望,我要么得到 TypeError: response.writeHead is not a function
,要么得到 TypeError: Attempted towrapp undefined property writeHead as function
如果我请设置一个。
var http = require('http'),
sinon = require('sinon'),
ServerResponse = http.ServerResponse;
function SendWelcomeResponse(response) {
var body = 'Hello World!';
response.writeHead(200, {'Content-Type': 'text/plain', 'Content-Length': body.length});
response.write(body);
response.end();
}
describe('Using Sinon I should be able to mock the ServerResponse', function () {
it.only('should mock correctly', function () {
var mockServerResponse = sinon.mock(ServerResponse);
mockServerResponse.expects('writeHead').once();
SendWelcomeResponse(mockServerResponse);
});
});
手动滚动对象进行模拟
我刚刚尝试了下面的两个建议,这些建议给出了TypeError:response.writeHead不是一个函数
。
var sinon = require('sinon'),
stubServerResponse = {
writeHead: function(statusCode, headers) {},
write: function(body){},
end: function() {}
};
function SendWelcomeResponse(response) {
var body = 'Hello World!';
response.writeHead(200, {'Content-Type': 'text/plain', 'Content-Length': body.length});
response.write(body);
response.end();
}
describe('Using Sinon I should be able to mock the ServerResponse', function () {
it.only('should mock correctly', function () {
var mockServerResponse = sinon.mock(stubServerResponse);
mockServerResponse.expects('writeHead').once();
SendWelcomeResponse(mockServerResponse);
});
});
工作!
神奇之处在于下面建议的解决方案,并使用模拟对象的 .object
属性而不是对象本身。下面给出绿色测试!
var sinon = require('sinon'),
stubServerResponse = {
writeHead: function(statusCode, headers) {},
write: function(body){},
end: function() {}
};
function SendWelcomeResponse(response) {
var body = 'Hello World!';
response.writeHead(200, {'Content-Type': 'text/plain', 'Content-Length': body.length});
response.write(body);
response.end();
}
describe('Using Sinon I should be able to mock the ServerResponse', function () {
it.only('should mock correctly', function () {
var mockServerResponse = sinon.mock(stubServerResponse);
mockServerResponse.expects('writeHead').once();
SendWelcomeResponse(mockServerResponse.object);
});
});
最佳答案
它看起来像 sinon.mock
只 stub 你传递的对象的 hasOwnProperty
方法;
https://github.com/sinonjs/sinon/blob/master/lib/sinon/extend.js#L63
我认为ServerResponse.writeHead
是在原型(prototype)上实现的。这样它的方法就不会被直接模拟。
一种选择是创建一个实现 writeHead 、 writeHead 和 end 的模拟对象,监视这些方法并对其进行断言。创建模拟对象时这将是一个更加手动的过程......
关于javascript - 无法使用 Sinon 模拟 http.ServerResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33696897/