Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 在类型脚本测试中模拟第三方库(ioredis)_Typescript_Mocking_Sinon_Testdoublejs - Fatal编程技术网

Typescript 在类型脚本测试中模拟第三方库(ioredis)

Typescript 在类型脚本测试中模拟第三方库(ioredis),typescript,mocking,sinon,testdoublejs,Typescript,Mocking,Sinon,Testdoublejs,在我的类型脚本测试中,要模仿第三方库,我经历了一段令人惊讶的艰难时光 我正在这个图书馆的基础上建立一个图书馆。它使用ava进行测试 在我的例子中,我试图模拟ioredis的主类,这样我的测试就不会试图建立真正的数据库连接 我试着用, ,及 在西农,我尝试了以下方法 let redisStub = sinon.stub(IORedis) sinon.assert.called(redisStub.Cluster) 使用testdouble,我尝试了很多东西,包括 td.replace('iore

在我的类型脚本测试中,要模仿第三方库,我经历了一段令人惊讶的艰难时光

我正在这个图书馆的基础上建立一个图书馆。它使用ava进行测试

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

我试着用, ,及

在西农,我尝试了以下方法

let redisStub = sinon.stub(IORedis)
sinon.assert.called(redisStub.Cluster)
使用testdouble,我尝试了很多东西,包括

td.replace('ioredis') // #1
td.replace('./homeMadeIoredisWrapperClass') // #2
我试过了

我还尝试了许多其他的变化,比如总是在方法中使用
require('ioredis')

我想在这里做些不可能的事吗?我认为对数据库进行存根/模拟是一件非常正常的事情,但我似乎无法理解

也许我的设计有缺陷,也许我试图嘲笑错误的东西?如果您能帮上忙,我们将不胜感激



顺便说一句,我正在尝试创建一个非常简单的ioredis连接包装器。

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

  • 我要求在
    td.replace
    之前使用“everything”(
    import{MyLibrary}from“MyLibrary”
    ),这使得replace语句发生在代码需要模块之后。原因在于,示例测试是以回购协议的特定方式设计的。我现在已作出决定
  • 我并行运行ava测试,这导致
    td.reset()
    在我的一些回调启动之前发生,在许多情况下有效地阻止了
    replace
    工作。在ava中的解决方案,使用
    test.serial(…
    代替
    test(…
    )。是的,测试将运行得较慢,但它们会工作。您可以为每个测试创建单独的文件,以在ava中获得真正的并行运行
  • testdouble GitHub页面中还有一些有用的wiki条目;

    希望有人觉得这很有用。

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

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