2017-10-03 14 views
0

私は、ngrx(Reduxロジックの場合)とrxjs(観測可能な場合)を使用して、角度2のプロジェクトに取り組んでいます。ngrxの角度2のコンポーネント - ユニットテストの実行時のエラー

これで、自動作成された.spec.tsファイルを実行してプロジェクトをテストしようとしました。

いくつかのテストは失敗し、それらのすべてがStore(ngrxから)を使用するコンポーネントのテストです。 ここではそのうちの一つである:

import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 
import { By } from '@angular/platform-browser'; 
import { DebugElement } from '@angular/core'; 

import { MyComponent } from './overlay-menu-item.component'; 

describe('MyComponent',() => { 
let component: MyComponent; 
let fixture: ComponentFixture<MyComponent>; 

beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
    declarations: [ MyComponent ], 
    }) 
    .compileComponents(); 
})); 

beforeEach(() => { 
    fixture = TestBed.createComponent(MyComponent); 
    component = fixture.componentInstance; 
    fixture.detectChanges(); 
}); 

it('should create',() => { 
    expect(component).toBeTruthy(); 
}); 
}); 

は、私は問題の世話、エラーがあった。

No provider to Store

は、だから私は追加:今すぐ

beforeEach(async(() => { 
TestBed.configureTestingModule({ 
    declarations: [ MyComponent ], 
    providers: [Store] 
}) 
.compileComponents(); 
})); 

(私はテストのためにジャスミンを使用します)他のエラーが発生しました:

No provider for StateObservable

だから私は追加します。

beforeEach(async(() => { 
TestBed.configureTestingModule({ 
    declarations: [ MyComponent ], 
    providers: [Store, StateObservable] 
}) 
.compileComponents(); 
})); 

しかし、今、私は私がそれをするために行うのか分からないという新しいエラーを得た:

Failed: Can't resolve all parameters for StateObservable: (?). 
    Error: Can't resolve all parameters for StateObservable: (?). 
     at syntaxError [mywebprojectPath]/node_modules/@angular/compiler/@angular/compiler.es5.js:1689:22) 

私は何をすべき?

答えて

0

MockStoreを作成する必要があります。要するに

import { Action } from '@ngrx/store'; 
import { Observable } from 'rxjs/Observable'; 
import { Subject } from 'rxjs/Subject'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 
import { map } from 'rxjs/operator/map'; 

export class MockStore<T> extends BehaviorSubject<T> { 
    constructor(private _initialState: T) { 
    super(_initialState); 
    } 
    dispatch = (action: Action): void => { 
    } 

    select = <T, R>(pathOrMapFn: any, ...paths: string[]): Observable<R> => { 
    return map.call(this, pathOrMapFn); 
    } 

}

次に、あなたがあなたのテストでmockStoreを提供することができます。

const initialState = {...}; 
TestBed.configureTestingModule({ 
    ... 
    providers:[ 
    {provide:Store, useValue: new MockStore(initialState)} 
    ] 
    ... 
}) 
関連する問題