使用Sinon/Mocha正确地存根请求/响应

cus*_*ice 5 javascript unit-testing mocha.js node.js sinon

我对后端的单元测试比较新,需要一些指导如何对以下内容进行单元测试.我正在使用Mocha/Should/Sinon.

exports.get = function(req, res) {
   if (req.query.example) {
      return res.status(200).json({ success: true });
   } else {
      return res.status(400).json({error: true});
   } 
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*und 7

您可以使用Sinon spystub函数来测试您的代码,如下所示:

const { spy, stub } = require('sinon');
const chai = require('chai');
chai.should();

describe('the get function', () => {
    let status,
        json,
        res;
    beforeEach(() => {
        status = stub();
        json = spy();
        res = { json, status };
        status.returns(res);
    });
    describe('if called with a request that has an example query', () => {
        beforeEach(() => get({ query: { example: true } }, res));
        it('calls status with code 200', () =>
            status.calledWith(200).should.be.ok
        );
        it('calls json with success: true', () =>
            json.calledWith({ success: true }).should.be.ok
        );
    });
    describe('if called with a request that doesn\'t have an example query', () => {
        beforeEach(() => get({ query: {} }, res));
        it('calls status with code 400', () =>
            status.calledWith(400).should.be.ok
        );
        it('calls json with error: true', () =>
            json.calledWith({ error: true }).should.be.ok
        );
    });
});
Run Code Online (Sandbox Code Playgroud)

在第一次beforeEach调用中,我正在创建一个名为stub的存根status和一个名为的spy json.

status存根用于测试是否响应的状态的方法被称为与正确的响应代码.

json间谍被用来测试是否响应的JSON方法被调用与正确的JSON代码.

注意我正在使用stub status来从任何调用status方法返回模拟响应,否则chaining(res.status().json())将无效.

因为json它足以使用一个简单的间谍,因为它位于链的末端.