2016-08-16 20 views
5

私はAngular2 RC5のユニットテストを更新しています。 changelogノート以下の互換性に影響する変更:Angular2 RC5正しくテストモジュールを設定する方法

addProviders [is deprecated], use TestBed.configureTestingModule instead

しかし、これはテスト中のサービスを含めるしようとした場合にのみ、エラーを取るように見えます。私のユニットテストは、次の操作を行うために使用される場合は:

beforeEach(() => addProviders([ 
    MyService, 
    MockBackend, 
    ... 
])); 

それは今テストモジュール構成する必要があります。

TestBed.configureTestingModule({ 
    providers: [ 
     StoryService, 
     MockBackend, 
     ... 
    ] 
}); 

をしかし、それは今

Service: MyService encountered a declaration exception FAILED

Error: Cannot configure the test module when the test module has already been instantiated. Make sure you are not using inject before TestBed.configureTestingModule .

は私がinjectことをチェックしてエラーをスローしますconfigureTestingModuleの前に呼び出されていません。これは他のコンポーネント/ディレクティブテストには影響しませんが、うまくいくようです。 RC5でサービスを単体テストする際にこのエラーを解決するにはどうすればよいですか?テストドキュメントがRC5用に更新されるまで待たなければならないかもしれないが、可能な解決策についての洞察は非常に高く評価されるだろう。

答えて

4

そうのようなbeforeEach内部スティックTestBed.configureTestingModule

私は同様の問題を持っていたし、テスト環境リセットして、それを固定
beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
      StoryService, 
      MockBackend, 
      ... 
] 
    }); 
}); 
+1

TypeErrorのような別のエラーが表示されます。nullのプロパティ 'injector'を読み取れません。何か案は? –

3

:それは2角度に来るとき、私はかなりのnoob午前

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); 
    })); 
}); 

をだから私はもっと知識のある人からの訂正を歓迎する。すべてのテストでテスト環境をリセットして再初期化する必要はないようです。残念ながら、私はそれを働かせることができた唯一の方法でした。

4

私が読んだところから、テスト環境を一度初期化するだけで済みます。あなたはその後、テストモジュールをリセットし、各テストの前にテストモジュールを構成することができます。

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

    afterEach(() => { 
     TestBed.resetTestingModule(); 
    }); 

先行の構成は次のとおりです。

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); 
} 

コードを読んだ後、configureTestingModuleが内部resetTestingModuleを呼び出しますようだが、私は読みやすさのためにそれぞれの後にそれを宣言するのが好きです。

関連する問題