模拟模块哪个不存在?
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'
。所以是的,他们使用的是字符串,顺序和我告诉你的一样。
是的,但它不能解决它。我已经更新了代码。以上是关于模拟模块哪个不存在?的主要内容,如果未能解决你的问题,请参考以下文章