Angular2测试。 Promise从未在TestBed.compileComponents中解决

时间:2016-12-07 11:09:41

标签: javascript unit-testing angular testing promise

我目前正在为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和实例。这些都没有被运行,我在其中添加了从未触发的断点。

有谁可以指出我在这里做错了什么?

谢谢!

1 个答案:

答案 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回调。