【问题标题】:Mocha / Sinon Unit test JS Class and Instance issueMocha / Sinon 单元测试 JS 类和实例问题
【发布时间】:2018-02-23 08:41:14
【问题描述】:

我正在尝试对一些依赖于我制作的某些类的快速中间件进行单元测试。

中间件.js

const MyClass = require('../../lib/MyClass');

const myClassInstance = new MyClass();

    function someMiddleware(req, res) {
        myClassInstance.get().then(function(resp) {
          res.render('somefile.html');
        });
    };

Test.js

const MyClass = require('../../lib/MyClass');
const sinon = require('sinon');
const chai = require('chai');
const expect = chai.expect;

// File we are testing
const someMiddleware = require('path/to/middleware');

MyClassMock = sinon.spy(function() {
    return sinon.createStubInstance(MyClassMock);
});
describe('My Middleware', function() {

    let renderSpy, classStub;
    let res = {
        render: function() {}
    }

    beforeEach(function() {
        renderSpy = sinon.stub(res, 'render');
    })

    afterEach(function() {
        renderSpy.restore();
    })

    it('should call render function', function() {

        someMiddleware.someMiddleware(req, res);
        expect(renderSpy.calledOnce);

    });
});

我已经尝试了很多东西,但是我似乎并不能真正模拟这个类并模拟创建的实例!当它运行时,它会尝试运行包含相关依赖项的实际类。

各位干杯!

【问题讨论】:

  • 这里有很多混乱 :-) 你有很多代码似乎是为你的情况设置的,但实际上并没有用于 任何东西 (例如:MyClassMockMyClass、...)。也许是编辑留下的?

标签: javascript unit-testing express sinon chai


【解决方案1】:

你的意图:替换/存根你的中间件的依赖。

你的问题:这在你的模块的外部是不可能的。您需要以某种方式“拦截”将使用哪些代码。

有两个选项,这两个选项我都在其他地方详细写过(123),所以我会在这里做简短的:

手动依赖注入

在您的中间件模块中,提供一个仅在测试中调用的__setMyClassInstance(stubbedInstance) 方法。

  • 专业版:非常简单,无需框架
  • Con:打开模块的仅测试代码

链接接缝

这是关于将代码中的require() 调用替换为另一个返回您喜欢的对象的模块加载器。在您的测试代码中:

const myMiddleware = proxyquire('../../src/middleware', { '../../lib/MyClass': myStubbedInstance })
  • Pro:实现与 DI 相同,但不需要更改模块中的代码
  • 缺点:发生的事情不是很清楚,需要学习新的依赖项

如果您在查看这些非常简短的解释后感到困惑,我建议您查看我提供的链接以获取长篇解释以及指向 Link Seam 库的教程链接,例如 proxyquirerewire

【讨论】:

  • 我不喜欢手动依赖的想法,比如更改模块代码,但是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2018-11-05
  • 2016-06-24
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多