模拟模块哪个不存在?

Posted

技术标签:

【中文标题】模拟模块哪个不存在?【英文标题】:mock module which does not exist? 【发布时间】:2018-04-07 17:58:27 【问题描述】:

当我在我的流星应用程序中运行我的 mocha 测试时:

node_modules/.bin/mocha --compilers js:babel-core/register //..opts

当我的待测模块想要导入时,我遇到了问题:

import  Meteor  from 'meteor/meteor';

所以我试着用嘲讽来嘲讽它:

mockery.enable();
moduleUnderTest = '../moduleUnderTest';
mockery.registerAllowable(moduleUnderTest);
meteorMock = ;
mockery.registerMock('Meteor', meteorMock);

很遗憾找不到模块

Error: Cannot find module 'meteor/meteor'

所以对 Meteor 的嘲讽是做不到的。

有没有办法伪造meteor/meteor的位置? (替代解决方案:如果我可以在我的 mocha 测试中访问 Meteor 环境)

【问题讨论】:

【参考方案1】:

如果您查看documentation,您会发现.registerAllowable 接受的是字符串,而不是模块。您还需要提供您要模拟的确切模块名称,并提供具有所需值的假模块。

所以:

var mockery = require("mockery");

mockery.enable();
mockery.registerAllowable("./moduleUnderTest");
// We want Meteor to have the value "foo". You probably want something
// different.
var meteorMock =  Meteor: "foo" ;
// We mock 'meteor/meteor' because that's what's imported.
mockery.registerMock('meteor/meteor', meteorMock);

如果你仔细想想,你正在做的事情是行不通的。 之前你需要模块 Mockery 被配置为模拟 'Meteor',所以 Node 加载你的模块,然后在模拟可用之前尝试加载 Meteor,你会失败。

此外,Meteor 模拟 modules,所以当你注册一个 mock 时,你必须提供一个 module 名称,而不是变量的名称。

【讨论】:

是的,但这就是为什么我要求一种方法来伪造不存在的模块 我不确定这应该是对我所写内容的回复。是的,你想伪造一个不存在的模块,理解。我指出您需要在运行尝试加载不存在的模块的代码之前设置模拟 好的,现在知道了。 Thx 4 提示,但这不应该是一个问题,因为他们在他们的例子中做了同样的事情 github.com/mfncooper/mockery/blob/master/examples/example1.js 我之前也尝试过使用字符串。 您指向的代码正是我说您必须做的事情。一方面,有moduleUnderTest = '../test/fixtures/intermediary'。所以是的,他们使用的是字符串,顺序和我告诉你的一样。 是的,但它不能解决它。我已经更新了代码。

以上是关于模拟模块哪个不存在?的主要内容,如果未能解决你的问题,请参考以下文章

Haste 模块映射中不存在模块`EmployeeFormReducer`

如何在nodejs Lambda中模拟不存在的文件导入

如何在不引发错误的情况下检查模块的存在?

如何知道 cocotb 测试台使用的是哪个模拟器?

电脑开机老是显示模块不存在

TP5 Nginx 提示:模块不存在:index