これは、を持つComponent
のテスト例で、angular2のドキュメントで提供されているスタブを使用しています。TestBedを使用したサービススタブへの変更の検出
私がそれをビルドして実行しようとしているとき、コンポーネントが2番目のテストケースの変更を受け取っていないことがわかります。私はいつもメッセージを見る。
サービスはこのようになります。「角度/コア@」から
インポート{注射}。
@Injectable()
export class UserService {
isLoggedIn: true;
user: { name: string };
}
コンポーネントは次のようになります。
import { Component, OnInit } from '@angular/core';
import { UserService } from './user.service';
@Component({
moduleId: module.id,
selector: 'app-welcome',
templateUrl: './welcome.component.html'
})
export class WelcomeComponent implements OnInit {
welcome = '--- not initialized yet';
constructor (private userService: UserService) {}
ngOnInit() {
this.welcome = this.userService.isLoggedIn ?
'Welcome, ' + this.userService.user.name :
'Please log in.';
}
}
これは、問題のユニットテストです:
import { async, TestBed, ComponentFixture, ComponentFixtureAutoDetect } from '@angular/core/testing';
import { DebugElement } from '@angular/core';
import { By } from '@angular/platform-browser';
import { UserService } from './user.service';
import { WelcomeComponent } from './welcome.component';
let fixture: ComponentFixture<WelcomeComponent>;
let comp: WelcomeComponent;
let de: DebugElement;
let el: HTMLElement;
let userService: UserService;
describe('Welcome Component (testing a component with a service)',() => {
beforeEach(async(() => {
const userServiceStub = {
isLoggedIn: true,
user: {
name: 'Test User'
}
};
return TestBed.configureTestingModule({
declarations: [
WelcomeComponent
],
providers: [
{
provide: ComponentFixtureAutoDetect,
useValue: true
},
{
provide: UserService,
useValue: userServiceStub
}
]
}).compileComponents(); // DO NOT USE WITH WEBPACK
}));
beforeEach(() => {
fixture = TestBed.createComponent(WelcomeComponent);
userService = TestBed.get(UserService);
comp = fixture.componentInstance;
de = fixture.debugElement.query(By.css('.welcome'));
el = de.nativeElement;
});
it('should welcome the user',() => {
fixture.detectChanges();
const content = el.textContent;
expect(content).toContain('Welcome', '"Welcome..."');
});
it('should welcome Bubba',() => {
userService.user.name = 'Bubba';
fixture.detectChanges();
expect(el.textContent).toContain('Bubba');
});
});
エラーが常にある:
Expected 'Welcome, Test User' to contain 'Bubba'.
エラー: 'Welcome、Test User'には 'Bubba'が含まれています。
デバッグ時に、サービススタブが適切な値で更新されていることがわかりました。
あなたはテンプレートに直接サービスにアクセスしていますか? –
@peeskillet私はスタブを使用して、 'TestBed.get(UserService);'を使って 'beforeEach'でそれを取得しようとしています。それはスタブを取り、それをサービスに変えますが、値を変更することはできません。私はサービスにアクセスする 'ngOnInit'にプロパティを作成しています。 – vamsiampolu
ええ、テンプレート内のサービスに直接アクセスしている場合を除き、サービスの値を変更するとテンプレートに影響するはずです。サービスの値に基づいてコンポーネント内の変数を割り当てる場合、これは初期の初期化に過ぎず、サービス更新時のコンポーネント変数は更新されません。代わりにSubjectをサービスに使用して、コンポーネントの値をサブスクライブすることができます。 –