Можно ли вызывать функции в модуле, добавленном с помощью 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.