Angular2 RC5如何正确配置测试模块

fil*_*oxo 8 unit-testing angular

我正在更新Angular2 RC5的单元测试.该更新日志指出以下重大更改:

addProviders[已弃用],请TestBed.configureTestingModule改用

但是,只有在尝试在测试中包含服务时,这似乎才会出错.我的单元测试用于执行以下操作:

beforeEach(() => addProviders([
    MyService,
    MockBackend,
    ... 
]));
Run Code Online (Sandbox Code Playgroud)

它现在应该配置测试模块:

TestBed.configureTestingModule({
    providers: [
        StoryService,
        MockBackend,
        ...
    ]
});
Run Code Online (Sandbox Code Playgroud)

但那现在抛出一个错误

服务:MyService遇到声明异常FAILED

错误:已经实例化测试模块时无法配置测试模块.确保您inject以前没有使用过TestBed.configureTestingModule.

我检查inject过之前没有被调用过configureTestingModule.这不会影响任何其他组件/指令测试,它们似乎传递得很好.如何使用RC5对服务进行单元测试来解决此错误?我意识到我可能要等到RC5的测试文档更新,但是对于可能的解决方案的任何见解都将非常感激.

小智 7

根据我的阅读,您只需要初始化测试环境一次。然后,您可以在每次测试之前重置测试模块并配置测试模块:

beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [ GridComponent ]
        });
    });

    afterEach(() => {
        TestBed.resetTestingModule();
    });
Run Code Online (Sandbox Code Playgroud)

前期配置是:

var testing = require('@angular/core/testing');
var browser = require('@angular/platform-browser-dynamic/testing');

try {
    testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting());
} catch ($error) {
    console.log("test env failure" + $error);
}
Run Code Online (Sandbox Code Playgroud)

阅读完代码后,configureTestingModule似乎将在内部调用resetTestingModule,但出于可读性考虑,我希望在每次声明之后都进行声明。


小智 5

我遇到了类似的问题,并通过重置测试环境来解决它:

import {MyService} from './my.service';
import {inject, TestBed} from '@angular/core/testing/test_bed';
import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } 
       from '@angular/platform-browser-dynamic/testing';

describe('MyService', () => {
  beforeEach(() => {
    // Must reset the test environment before initializing it.
    TestBed.resetTestEnvironment();

    TestBed
      .initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting())
      .configureTestingModule({
        providers: [
          MyService
        ]
    });
  });

  it('should do something', inject([MyService], (s: MyService) => {
    let r = s.getResult();
    expect(r.length).toBe(2);
  }));
});
Run Code Online (Sandbox Code Playgroud)

对于Angular 2,我是个菜鸟,所以我欢迎知识渊博的人进行更正。似乎不必在每次测试中都必须重置和重新初始化测试环境。不幸的是,这是我能够使其工作的唯一方法。


小智 4

TestBed.configureTestingModule像这样粘在 beforeEach 里面:

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            StoryService,
            MockBackend,
            ...
]
    });
});
Run Code Online (Sandbox Code Playgroud)