Замена зависимостей в формате модуля AMD с testdouble.js

Я пишу тесты для приложения JS, используя Jasmine и testdouble.js в качестве библиотеки-макета. Я использую формат AMD для организации кода в модулях, а RequreJS в качестве загрузчика модулей. Мне было интересно, как использовать testdouble.js для замены зависимости для тестируемого модуля в формате AMD, который загружается через RequireJS. В документации нет ясности по этому поводу, или я что-то упускаю, так что если кто-то может указать мне правильное направление.

Ниже я приведу пример, который иллюстрирует мои настройки и проблемы, с которыми я сталкиваюсь.

car.js

define("car", ["engine"], function(engine) {
  function drive = {
    engine.run();
  }

  return {
    drive: drive
  }
});

engine.js

define("engine", function() {
  function run() {
    console.log("Engine running!");
  }

  return {
    run: run
  }
});

car.spec.js

define(["car"], function(car) {
  describe("Car", function() {
    it("should run the motor when driving", function() {
      // I am not sure how to mock the engine's object run method
      // and where to place that logic, in beforeEach or...
      td.replace(engine, "run");
      car.drive();
      // How to verify that when car.run() has executed, it calls this mocked method
      td.verify(engine.run());
    });
  });
});

1 ответ

Решение

testdouble.js не имеет явной поддержки модулей AMD. Единственные трюки, связанные с модулями, которые он предлагает, являются специфичными для Node.js и построены поверх загрузчика модулей CJS Node.

Что вам нужно сделать в этом случае, это потребовать от теста ссылку на engine и заменить run свойство, которое, кажется, вы сделали (ваш пример неполон).

Если вы делаете это, не забудьте запустить td.reset() в afterEach восстановить первоначальные свойства на все, что вы замените!

Другие вопросы по тегам