javascript - 无法使用 Sinon 模拟 http.ServerResponse

标签 javascript node.js mocha.js sinon

我的方法接受 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/

相关文章:

javascript - 使用 React hooks 从另一个页面使用 useEffect 更新状态

javascript - 在 AJAX 成功响应中调用函数?

javascript - 如何阻止 Hammer.js 不传播滑动事件?

javascript - NPM 安装后找不到模块错误

javascript - mocha-webpack 找不到测试

javascript - 如何停止传播?

node.js - 多个监听器从 NodeJS 中的同一流读取

javascript - 检查单元测试中是否调用了函数

javascript - sinon 监视功能不起作用

javascript - Sinon.js- 试图监视 console.log 但它已经被包裹