【问题标题】:JS testing a middleware is returning next()JS 测试中间件返回 next()
【发布时间】:2019-03-29 12:59:42
【问题描述】:

我有一个像这样的中间件类

// code.js
function validation(req, res, next) {
    if (validationLogic(req)) {
        res.send(400);
        return next(false);
    }
    return next();
}

// code.test.js
describe('validation', () => {
    describe('when req is valid', () => {
        //setting up req, res, next stub

        //some other test

        //HERE IS MY QUESTION, how do I text that validation returns next(), and not next(false)
        it('return next(), and next() is called exactly once', () => {
            const spy = sinon.spy();
            nextStub = spy;
            const result = validation(reqStub, resStub, nextStub);
            assert(spy.calledOnceWithExactly());
            assert(result === nextStub()); // both of this
            assert(result === nextStub(false)); // and this line passed
        });
    });
});

我试图测试我的validation 函数是否返回next() 而不是next(false)。但是在测试中,貌似只有assert(spy.calledOnceWithExactly())可以测试next中的参数。但是assert(result === nextStub()) 后面的行不能测试任何东西,除了结果实际上来自函数next()

assert(spy.calledOnceWithExactly()) 是否足够,或者有其他方法可以测试它吗?

【问题讨论】:

    标签: javascript unit-testing middleware sinon restify


    【解决方案1】:

    您不需要使用间谍。您始终可以创建一个接受参数并将其替换为 next 的“占位符”函数,并确保该函数没有返回 false

    it('return next(), and next() is called exactly once', () => {
        const nextStub = (arg) => (arg === false ? arg : 'I was called!');
        const result = validation(reqStub, resStub, nextStub);
        
        assert(result !== false);
        assert(result === 'I was called!');
    });

    类似的东西可能会奏效。或者,如果您真的想使用间谍,您可以检查间谍的返回值和间谍被调用的内容。确保你的 spy 函数可以接受参数。

    https://sinonjs.org/releases/v7.0.0/spy-call/

    【讨论】:

      【解决方案2】:

      解决此问题的一种简洁方法是使用expectation 来验证是否使用确切的参数调用了一次next,并且结果是从validation 返回的:

      it('return next(), and next() is called exactly once', () => {
        const expectation = sinon.mock().once().withExactArgs().returns('called with no args');
        nextStub = expectation;
        const result = validation(reqStub, resStub, nextStub);
        expectation.verify();  // SUCCESS
        assert(result === 'called with no args');  // SUCCESS
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-28
        • 2020-11-30
        • 2019-10-02
        • 1970-01-01
        • 2022-10-02
        • 2021-10-25
        • 2019-12-07
        • 2021-02-26
        相关资源
        最近更新 更多