在打字稿测试中嘲弄第三方库(ioredis)

时间:2018-01-10 13:47:06

标签: typescript mocking sinon testdoublejs

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

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

在我的情况下,我试图模拟ioredis的主类,以便我的测试不会尝试建立真正的数据库连接。

我曾尝试使用sinon,  testdouble.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连接包装器。

2 个答案:

答案 0 :(得分:0)

我的代码存在一些误解/问题导致了这一点。也许这可以启发其他人绊倒这个;

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

    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

    希望有人觉得这很有用。

答案 1 :(得分:0)

您可以仅使用sinon模拟ioredis(4.16.2版)。您必须模拟connect方法。

super();