我目前正在为Angular2组件中的模块编写测试模块,该模块使用templateUrl属性,因此需要在测试之前对TestBed.compileComponents异步调用进行编译。
我遇到的问题是promise回调(然后)函数中的任何内容都根本没有运行......好像承诺没有解决。
这是我的代码。
模块:
// "backToPage01Tapped" is just an example, it should be your method's name...
@IBAction func backToPage01Tapped(_ sender: Any) {
navigationController?.popToRootViewController(animated: true)
}
HTML模板:
import { Component } from "@angular/core";
@Component({
selector: 'categories-component',
templateUrl: '/app/views/catalog/categories/categories-dashboard.html',
moduleId: module.id
})
export class CategoriesComponent {
title: 'Categories;
}
测试模块:
<h1>{{ title }}</h1>
});
正如您所看到的,在我的测试中,我调用compileComponents来异步编译测试模块,然后在回调中创建测试组件的fixture和实例。这些都没有被运行,我在其中添加了从未触发的断点。
有谁可以指出我在这里做错了什么?
谢谢!
答案 0 :(得分:3)
这是因为测试是同步的
it('...', () => {
})
回调函数执行后,执行回调,并在后立即完成测试。
但问题是你在异步回调中拥有所有代码
it('...', () => {
TestBed.compileComponents().then(() => {
// asynchronous
// code not executed
})
})
因此异步代码永远不会在测试完成之前执行。
这可以通过几种方式处理。您可以使用原生jasmine done
回调
it('...', (done) => {
TestBed.compileComponents().then(() => {
/// do stuff
done();
})
})
在这里,jasmine传递了一个回调函数。当你完成所有异步操作时,你就可以调用它。
另一种方式是使用Angular async
。
import { async } from '@anguar/core/testing';
it('...', async(() => {
TestBed.compileComponents().then(() => {
})
}))
这样做是将测试包装在测试区域中,该区域跟踪所有异步任务,并在所有异步任务完成后完成测试。在茉莉花环境中,测试区域将在异步任务完成后实际调用jasmine done
回调。