Модульное тестирование: нет поставщика для "InterceptableStoreFactory", даже если он добавлен в "поставщики"
Я работаю над модульными тестами в своем приложении Angular, я использую подход TestBed,
Я тестирую компоненты, поэтому каждый файл спецификаций выглядит так
import...
describe('AppComponent', () => {
// Importing dependecies
beforeEach(async(() => {
TestBed.configureTestingModule({
imports : [RouterTestingModule , HttpModule , FormsModule ],
declarations: [AppComponent
],
providers: [AUTH_PROVIDERS ,UserService, SharedclientService, RouteNavigator, JwtHelper, ReloadTokenService, ShopService
, EnvVarsService, ProfileService, LocalStorageService, ApiVersionInterceptor, ApiTrackingInterceptor, MonitoringService ,
{ provide: 'LOCAL_STORAGE_SERVICE_CONFIG', useValue: userConfig } , TokenUtilService , HttpInterceptorService ,
{ provide: InterceptableStoreFactory, useClass: InterceptableStoreFactoryMock },ReloadTokenEventService , InterceptableStoreFactory
]
}).compileComponents();
}));
// detecting changes every times
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
// Test case 0 (compilation of the component)
it('AppComponent is well defined', () => {
expect(component).toBeDefined();
});
// Test case 1
it('test', () => {
expect("1").toBe("1");
});
});
Такой подход к тестированию вызывает сбой всего набора тестов, если импорт зависимостей идет плохо.
Например: в этом тестовом наборе выдается эта ошибка:
Нет поставщика для InterceptableStoreFactory! Это кажется странным, так как я импортирую эту услугу в моих провайдеров (последний)
Это приводит почти к сбою во всех тестовых примерах, так как проверка импорта осветителей - это тесты " beforeEach "
Ищу лучшие идеи для:
- проблема "нет поставщика услуг" (который уже добавлен к поставщикам "
и для
- модульное тестирование - лучший способ тестирования
2 ответа
Вы предоставляете InterceptableStoreFactory дважды. Один раз с ложной заменой, один раз с оригиналом. Попробуйте удалить один из них.
Это может помочь вам создать модуль для всех ваших служб и поместить его в папку "core". (См. Угловое руководство по стилю)
Это облегчает предоставление всех необходимых услуг как в тестировании, так и в разработке / производстве, не повторяя при этом слишком много.
1. Нет поставщика услуг
Удалить трейлинг InterceptableStoreFactory
в массиве провайдеров. Как вы уже вводите макет службы InterceptableStoreFactory
раньше на той же линии.
Если это не помогло, пожалуйста, предоставьте фрагмент вашего учебного класса InterceptableStoreFactoryMock
а также InterceptableStoreFactory
,
2. Лучшая стратегия тестирования
Для лучшей стратегии тестирования я бы предложил несколько вещей, облегчающих тестирование:
- Предлагаемый здесь в Angular Styleguide: собрать все глобальные услуги в один
CoreModule
, Вы можете легко узнать, что все сервисы импортируются, и легко импортировать их для тестирования. Я также рекомендовал бы, возможно, создание явногоCoreTestingModule
если вы хотите смоделировать многие из этих служб одинаково для многих компонентов. Таким образом сохраняя возможность повторного использования для всех тестов. - Предложенный здесь в Angular Styleguide:
SharedModule
в котором вы можете экспортировать компоненты, директивы и каналы, которые вы часто используете в приложении. - Рассмотрите возможность использования очень маленьких модулей. В часто задаваемых вопросах на одной из конференций во второй половине 2017 года или в начале 2018 года Роб Уормальд упомянул, что каждый модуль в проекте Google Angular имеет в среднем только 1,6 компонента. Это означает, что каждый тест компонента с меньшей вероятностью будет включать в себя сервисы и другие операции импорта, которые ему на самом деле не нужны. Таким образом, также требуется гораздо меньше рефакторинга тестов, если вы меняете большой модуль, используемый очень многими компонентами. С меньшими модулями ваш
TestBed
также будет намного быстрее, так как это происходит намного быстрее, чтобы повторно инициализироватьTestBed
после каждого теста. - Подумайте о том, чтобы перенести большую часть логики на сервисы и каналы и в первую очередь перенести на них фокус тестирования. Так как сервисы тестирования и каналы могут использовать обычную инфраструктуру тестирования и, таким образом, пропустить сложность создания модулей, поскольку сервисы и каналы могут рассматриваться как обычные классы и функции. В качестве дополнительного примечания я бы упомянул, что это более или менее выполняется автоматически путем перехода на архитектуру NGRX.
- Эта проблема отслеживает большее улучшение производительности
TestBed
, Теперь проблема в том, что вам нужно заново создавать и разрывать модуль между каждым тестовым примером. Сделать это намного медленнее, чем просто тестировать сервисы, каналы и другие чистые функции и классы. Как уже упоминалось ранее, это немного исправлено с помощью меньших модулей. В этой проблеме также показано несколько способов использования Jest или обходных путей, чтобы не нужно было заново создавать модули для каждого тестового примера и использовать их повторно. Последнее, однако, меняет частные API, поэтому ваше приложение может легко сломаться между выпусками патчей Angular, что не очень удобно.