макет модуля, которого не существует?

Когда я запускаю тесты мокко в своем приложении Meteor:

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 в моем тесте мокко)


person Gobliins    schedule 26.10.2017    source источник


Ответы (1)


Если вы посмотрите документацию, то увидите, что .registerAllowable принимает строку , а не модуль. Вам также необходимо указать точное имя модуля, над которым вы издеваетесь, и предоставить поддельный модуль с нужными вам значениями.

So:

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 имитирует модули, поэтому при регистрации имитации вы должны указать имя модуля, а не имя переменной.

person Louis    schedule 26.10.2017
comment
да, но именно поэтому я прошу способ подделать несуществующий модуль - person Gobliins; 26.10.2017
comment
Я не уверен, как это должно быть ответом на то, что я написал. Да, вы хотите подделать модуль, которого нет, понял. Я указываю, что вам нужно настроить свой макет перед запуском кода, который пытается загрузить несуществующий модуль. - person Louis; 26.10.2017
comment
Хорошо, теперь понял. Спасибо за подсказку, но это не должно быть проблемой, поскольку они делают то же самое в своем примере github.com/mfncooper/mockery/blob/master/examples/example1.js Раньше я тоже пробовал использовать строку. - person Gobliins; 27.10.2017
comment
Код, на который вы указываете, делает именно то, что я говорю, вы должны делать. Во-первых, есть moduleUnderTest = '../test/fixtures/intermediary'. Так что да, они используют строку, и порядок такой же, как я вам говорю. - person Louis; 27.10.2017
comment
Верно, но это не исправляет. Я обновил код. - person Gobliins; 30.10.2017
comment
Мой первоначальный ответ был сосредоточен на слоне в комнате, но я упустил кое-что еще. Я только что редактировал. - person Louis; 30.10.2017