javascript - 使用 Sinon 模拟常量/变量?

标签 javascript unit-testing mocha.js sinon chai

我对测试相当陌生,对 Sinon 更陌生。

这里我设置了一条快速路线:

import context = require("aws-lambda-mock-context");

this.router.post('/', this.entryPoint);

public entryPoint(req: Request, res: Response, next: NextFunction) {
    const ctx = context();
    alexaService.execute(req.body, ctx);
    ctx.Promise
        .then((resp: Response) => res.status(200).json(resp))
        .catch((err: Error) => res.status(500));
}

我的目标是测试对 / 的 post 调用是否正常运行。我的测试脚本是:

describe('/POST /', () => {
    it('should post', () => {
        chai.request(app)
            .post('/v2')
            .end((err, res) => {
                expect(res).to.be.ok;
            });
    });
});

尽管我的测试通过了,但由于 const ctx = context() 未被识别,它返回 status: 500。是否有适当/正确的方法来监视变量 ctx 并使用 Sinon 在我的测试中返回模拟变量?我已经在这里旋转了很长时间。

最佳答案

这是我自己遇到的一个常见问题。我测试了多种解决方案,我发现效果最好的是 Mockery .

它是这样工作的:在你 require 被测模块之前,你告诉 Mockery 用 mocks 替换被测模块需要的模块。

对于您的代码,它看起来像这样:

const mockery = require('mockery');
const { spy } = require('sinon');

describe('/POST /', () => {
    let ctxSpy;
    beforeEach(() => {
        mockery.enable({
            useCleanCache: true,
            warnOnUnregistered: false
        });
        ctxSpy = spy();
        mockery.registerMock('"aws-lambda-mock-context"', ctxSpy);

        // change this to require the module under test
        const myRouterModule = require('my-router-module'); 

        myRouterModule.entryPoint({}, {}, () => {});
        return ctxSpy;
    });

    it('should call ctx', () => {
        expect(ctxSpy).called.to.be.ok;
    });

    afterEach(() => {
        mockery.deregisterAll();
        mockery.disable();
    });
});

关于javascript - 使用 Sinon 模拟常量/变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42603341/

相关文章:

javascript - 类型错误 : Cannot read property 'state' of undefined in bootstrap

unit-testing - 如何在 clojure.test 中为一组测试设置固定装置

javascript - 在客户端 Mocha 单元测试期间使用外部类

javascript - Mocha 测试用例抛出 Error : expected 200 "OK", got 403 "Forbidden"

javascript - 将谷歌图表保存到图像中并在新选项卡中打开它们

javascript - 在 Backbone.js 中将函数设置为属性给我一个错误,但如果我在初始化方法中设置它,它就会工作

c# - 如何对 MVC ASP.Net 返回正确的 View 进行单元测试?

iphone - 您测试 iPhone/iPad 应用程序的方法是什么?

javascript - 如何模拟通过 require 创建的对象

javascript - 现有 javascript 代码是否有等效的 jquery 代码?