首先,这不是一个“破坏性”问题,但我不喜欢运行单元测试时出现错误。所以无论如何,如果您使用 Ionic 创建页面/组件并使用 ion-infinite-scroll
组件,然后继续对该组件进行单元测试,那么将会
always出现如下错误:
An error was thrown in afterAll
Uncaught TypeError: Cannot read property 'apply' of undefined thrown
现在这不会使测试套件失败,但它确实会显示在控制台中并将其弄乱。我尝试使用ng-mocks
来模拟这个子组件,但这似乎仍然存在。我正在使用 spectator 和 Jasmine 的默认设置。我认为这个问题与使用这些工具无关。有谁知道如何正确模拟 ion-infinite-scroll
组件,以便测试套件不会调用实际组件上的方法?
这是我尝试过的:
describe('SomePage', () => {
let spectator: Spectator<SomePage>;
const infiniteScrollStub = {
complete: jasmine.createSpy('complete')
};
const createComponent = createRoutingFactory({
component: SomePage,
declarations: [
IonInfiniteScroll
],
providers: [
{ provide: IonInfiniteScroll, useValue: infiniteScrollStub }
],
params: {}
});
beforeEach(() => spectator = createComponent());
it('should create', () => {
expect(spectator.component).toBeTruthy();
});
});
===
An error was thrown in afterAll
Uncaught TypeError: Cannot read property 'apply' of undefined thrown
describe('SomePage', () => {
let spectator: Spectator<SomePage>;
const infiniteScrollStub = {
complete: jasmine.createSpy('complete')
};
const createComponent = createRoutingFactory({
component: SomePage,
declarations: [
MockComponent(IonInfiniteScroll)
],
params: {}
});
beforeEach(() => spectator = createComponent());
it('should create', () => {
expect(spectator.component).toBeTruthy();
});
});
===
Error: Multiple components match node with tagname ion-infinite-scroll
测试通过了第一个示例,但最后出现了丑陋的错误。 由于这个原因,第二个示例的测试失败了。
有什么想法吗?
在测试中,只有 SUT 不应该被嘲笑。所以正确的做法是mock
IonicModule
:
MockModule(IonicModule)
,压制它对环境和逻辑的要求。