Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.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
Javascript 如何用jest模拟从方法内部启动的构造函数_Javascript_Ecmascript 6_Jestjs_Mocking - Fatal编程技术网

Javascript 如何用jest模拟从方法内部启动的构造函数

Javascript 如何用jest模拟从方法内部启动的构造函数,javascript,ecmascript-6,jestjs,mocking,Javascript,Ecmascript 6,Jestjs,Mocking,我有一个脚本,它定义了两个类,其中一个从另一个类的构造函数中实例化。如何模拟嵌套构造函数,以便测试父构造函数 导出默认类Foo{ //我想测试这个构造函数。。。 建造师{ 新酒吧 } } 导出类栏{ //但是模仿这个构造函数 构造函数{} } 此外,我试图监视Bar构造函数,以断言它已被调用 我尝试了几种不同的方法,但都没有得到我想要的结果。我是jest mocking库的新手需要对模块导出语句进行一些修改。然后,我们可以使用方法来模拟Bar类的实现。请在编译后查看。我们在模块导出对象中创建模拟

我有一个脚本,它定义了两个类,其中一个从另一个类的构造函数中实例化。如何模拟嵌套构造函数,以便测试父构造函数

导出默认类Foo{ //我想测试这个构造函数。。。 建造师{ 新酒吧 } } 导出类栏{ //但是模仿这个构造函数 构造函数{} } 此外,我试图监视Bar构造函数,以断言它已被调用


我尝试了几种不同的方法,但都没有得到我想要的结果。我是jest mocking库的新手

需要对模块导出语句进行一些修改。然后,我们可以使用方法来模拟Bar类的实现。请在编译后查看。我们在模块导出对象中创建模拟条,并在Foo类中使用它。它的引用与模拟的引用相同

推荐方式:

依赖注入 每个文件只包含一个类。因此,我们可以使用jest.mock或jest.doMock方法来模拟该类,而无需修改模块导出语句。 例如

index.ts:

导出默认类Foo{ 建造师{ 新出口。酒吧; } } 分类栏{ 建造师{ console.log'realbar构造函数实现'; } } 出口。巴=巴; index.test.ts:

从“/”导入*作为mod; console.logmod; 描述'64549093',=>{ 它“应该通过”,=>{ const BarConstructorMock=jest.spyOnmod作为任何“Bar”。mockImplementationOnce=>{ console.log“假条构造函数实现”; }; 新mod.default; expectBarConstructorMock.toBeCalled; }; }; 单元测试结果:

 PASS  src/stackoverflow/64549093/index.test.ts (9.905s)
  64549093
    ✓ should pass (5ms)

  console.log src/stackoverflow/64549093/index.test.ts:3
    { default: [Function: Foo], Bar: [Function: Bar] }

  console.log src/stackoverflow/64549093/index.test.ts:8
    fake Bar constructor implmentation

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.751s, estimated 12s
关于jestjs、TypeScript的配置,请参见示例:
需要对模块导出语句进行一些修改。然后,我们可以使用方法来模拟Bar类的实现。请在编译后查看。我们在模块导出对象中创建模拟条,并在Foo类中使用它。它的引用与模拟的引用相同

推荐方式:

依赖注入 每个文件只包含一个类。因此,我们可以使用jest.mock或jest.doMock方法来模拟该类,而无需修改模块导出语句。 例如

index.ts:

导出默认类Foo{ 建造师{ 新出口。酒吧; } } 分类栏{ 建造师{ console.log'realbar构造函数实现'; } } 出口。巴=巴; index.test.ts:

从“/”导入*作为mod; console.logmod; 描述'64549093',=>{ 它“应该通过”,=>{ const BarConstructorMock=jest.spyOnmod作为任何“Bar”。mockImplementationOnce=>{ console.log“假条构造函数实现”; }; 新mod.default; expectBarConstructorMock.toBeCalled; }; }; 单元测试结果:

 PASS  src/stackoverflow/64549093/index.test.ts (9.905s)
  64549093
    ✓ should pass (5ms)

  console.log src/stackoverflow/64549093/index.test.ts:3
    { default: [Function: Foo], Bar: [Function: Bar] }

  console.log src/stackoverflow/64549093/index.test.ts:8
    fake Bar constructor implmentation

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.751s, estimated 12s
关于jestjs、TypeScript的配置,请参见示例:

这两个类都在同一个模块中吗?我最近读到一篇文章,建议如果你想模拟一个而不是另一个,就应该将它们分成不同的模块文件。构造函数和它所表示的类是一样的。从字面上看,Bar.prototype.constructor===Bar。所以它是一个构造函数,不提供任何关于测试的机会。您不能模拟在定义它的同一模块中使用的变量,即故事的结尾。Foo构造函数包含副作用并忽略Bar实例,这可能是一个反模式,应该首先解决。如果有this.bar=newbar,您可以断言它。这两个类都在同一个模块中吗?我最近读到一篇文章,建议如果你想模拟一个而不是另一个,就应该将它们分成不同的模块文件。构造函数和它所表示的类是一样的。从字面上看,Bar.prototype.constructor===Bar。所以它是一个构造函数,不提供任何关于测试的机会。您不能模拟在定义它的同一模块中使用的变量,即故事的结尾。Foo构造函数包含副作用并忽略Bar实例,这可能是一个反模式,应该首先解决。如果有这个。bar=你可以断言它。这非常有用!这不仅有助于解决我的问题,而且有助于我更好地理解笑话。感谢tyvm花时间提供如此清晰详细的信息!:原始代码仅包含ESM,不包含CJ。使用exports对象是解决此问题的一个已知方法,但ESM和CJ混合在同一个模块中是一个闻起来很难闻的黑客行为。@EstusFlask这是对slideshowp2的第二个项目符号“每个文件只包含一个类”的引用吗?实际上,我在导入语法中找到了文档,但在jest.spyOn中没有使用mod。使用jest.spyOnmod,Bar似乎也能正常工作,但添加和任何添加一样有什么作用呢?这只是打字稿吗?或者它在js中有意义吗?@brewster在示例中是对new exports.Bar的引用。每个模块有一个模块
类是这里唯一合理的解决方案,而不是示例所显示的。是的,任何事情都是如此。依赖jest.spyOnmod,Bar是不安全的,因为模块根据规格是只读的,并且根据设置,它们在jest中可以是只读的。这非常有用!这不仅有助于解决我的问题,而且有助于我更好地理解笑话。感谢tyvm花时间提供如此清晰详细的信息!:原始代码仅包含ESM,不包含CJ。使用exports对象是解决此问题的一个已知方法,但ESM和CJ混合在同一个模块中是一个闻起来很难闻的黑客行为。@EstusFlask这是对slideshowp2的第二个项目符号“每个文件只包含一个类”的引用吗?实际上,我在导入语法中找到了文档,但在jest.spyOn中没有使用mod。使用jest.spyOnmod,Bar似乎也能正常工作,但添加和任何添加一样有什么作用呢?这只是打字稿吗?或者它在js中有意义吗?@brewster在示例中是对new exports.Bar的引用。在这里,每个类有一个模块是唯一合理的解决方案,而不是示例所示。是的,任何事情都是如此。依赖jest.spyOnmod,Bar是不安全的,因为根据规格,模块是只读的,并且根据设置,它们在jest中可以是只读的。