【问题标题】:Mocking third party library (ioredis) in typescript tests在打字稿测试中模拟第三方库(ioredis)
【发布时间】:2018-01-10 13:47:06
【问题描述】:

在我的打字稿测试中,我很难模拟第三方库。

我正在基于这个typescript-starter 库创建一个库。它使用 ava 进行测试。

在我的例子中,我试图模拟 ioredis 的主类,这样我的测试就不会尝试建立真正的数据库连接。

我尝试使用sinontestdouble.jsmockery

在sinon我尝试了以下

let redisStub = sinon.stub(IORedis)
sinon.assert.called(redisStub.Cluster)

使用 testdouble 我尝试了很多东西,包括:

td.replace('ioredis') // #1
td.replace('./homeMadeIoredisWrapperClass') // #2

我试过mockery

mockery.enable()
mockery.registerMock('ioredis', {some: 'object'})

我还尝试了许多其他变体,例如在方法中始终使用require('ioredis')

我想在这里做一些不可能的事情吗?我虽然存根/模拟数据库是一件非常正常的事情,但我似乎无法弄清楚。

也许我的设计有缺陷,也许我试图模拟错误的东西?一些帮助将不胜感激!


附言。在重要的情况下,我正在尝试创建一个非常简单的 ioredis 连接包装器。

【问题讨论】:

    标签: typescript mocking sinon testdoublejs


    【解决方案1】:

    我的代码有一些误解/问题导致了这种情况。也许这可以启发其他偶然发现此问题的人;

    1. 我在 td.replace 之前需要“一切”(import { MyLibrary } from "myLibrary"),这使得替换语句在代码需要模块之后发生。原因是示例测试是在typescript-starter repo 中以特定方式设计的。我现在发了一个PR to fix the underlying problem
    2. 我正在并行运行 ava 测试,这导致 td.reset() 在我的一些回调触发之前发生,从而有效地阻止了 replace 在许多情况下工作。 ava 中的解决方案,使用test.serial(... 代替test(...。是的,测试会运行得更慢,但它们会起作用。您可以为每个测试创建一个单独的文件,以便在 ava 中获得真正的并行运行。

    testdouble GitHub 页面中也有一些有用的 wiki 条目; https://github.com/testdouble/contributing-tests/wiki/Don%27t-mock-what-you-don%27t-own https://github.com/testdouble/contributing-tests/wiki/SAFE-test

    希望有人觉得这很有用。

    【讨论】:

      【解决方案2】:

      您可以仅使用 sinon 来模拟 ioredis(版本 4.16.2)。您必须模拟连接方法。

      import ioredis from "ioredis";
      
      sinon.stub(ioredis.prototype, "connect").returns(Promise.resolve());
      sinon.stub(ioredis.prototype, "get").returns(Promise.resolve({ data: "hello" }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多