Можно ли вызывать функции в модуле, добавленном с помощью addMockModule? (транспортир)

В настоящее время я использую Protractor для тестирования приложения AngularJS, высмеивая его бэкэнд browser.addMockModule() (на основе обсуждения # 125) и использования макета $httpBackend для тестирования E2E с дополнительным модулем "data" (myDataModule), который помогает мне управлять ответами (в this.mockLayer), сохраняя их в другом файле.

Вот упрощенная версия кода:

//here I add the data module
browser.addMockModule('myDataModule', (mockLayer) => {
    angular.module('myDataModule', []).value('mockLayer', mockLayer);
}, this.mockLayer);

//then I mock the $httpBackend using the data module
browser.addMockModule('httpBackendMock', () => {
    angular.module('httpBackendMock', ['myDataModule'])
        .run(['$httpBackend', 'mockLayer', ($httpBackend, mockLayer) => {

        $httpBackend.whenGET(/\/api\/v1\.0\/foo\/bar/)
            .respond(200, mockLayer.fooBar);
        });

        let result = mockLayer.dummy( 3, 2 );
        // result is expected to be 5, right?

        //...
   }]);
});

А вот класс MockLayer я создаю и добавляю как this.mockLayer:

export class MockLayer {
    constructor() {
        this.fooBar = {
            foo: 'bar'
        };
    }

    dummy( a, b ) {
        return a + b;
    }
}

Дело в том, что даже если mockLayer.fooBar найден и используется без проблем на втором модуле, функция mockLayer.dummy() не найден. Я получаю это на консоли:

11:33:25.960 WARN - Exception thrown
org.openqa.selenium.WebDriverException: unknown error:
mockLayer.dummy is not a function

API говорит о module.value():

Зарегистрируйте службу значений с помощью инжектора $, такого как строка, число, массив, объект или функция.

Так что я могу использовать module.value() сохранить объект или функцию. И объект с функцией внутри тоже должен быть действительным.

Кроме того, я понимаю, что тестовый код выполняется на стороне сервера (транспортир), а код приложения выполняется на стороне клиента (угловой в браузере). Но я не уверен, что это как-то связано с таким поведением.

С другой стороны, документы по транспортировке говорят об этом browser.addMockModule():

это будет выполнено в контексте браузера, поэтому он не может получить доступ к переменным вне своей области видимости.

но это не (насколько я понимаю) доступ к любой переменной вне ее области видимости.

Итак... что я делаю не так? или это ошибка или что-то, связанное с тем, как транспортир отправляет код через веб-драйвер для настройки $httpBackend в браузере?

Кстати, я использую

  • angular-mocks 1.5.0
  • транспортир 2.5.1
  • Бабель ~5,8
  • браузер Chrome

Стоит отметить, что этот вопрос похож на этот, но он должен был быть исправлен в транспортире 1.8.

0 ответов

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