模拟模块不存在?

时间:2017-10-26 11:14:29

标签: node.js meteor mocking mocha mockery

当我在我的流星应用程序中运行我的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吗? (替代解决方案:如果我可以在我的摩卡测试中访问流星环境)

1 个答案:

答案 0 :(得分:3)

如果查看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模拟模块,因此当您注册模拟时,您必须提供模块名称,而不是变量名称。