【发布时间】:2017-03-14 04:06:45
【问题描述】:
这是使用 angular2 文档中提供的存根的 Component 和 Service 的测试示例。
当我尝试构建并运行它时,我发现该组件没有为第二个测试用例获取更改。我总是看到消息。
服务如下所示:
从“@angular/core”导入 { Injectable };
@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'.
错误:预期的“欢迎,测试用户”包含“Bubba”。
调试的时候发现服务存根更新了合适的值。
【问题讨论】:
-
您是直接在模板中访问服务吗?
-
@peeskillet 我正在尝试使用存根并使用
TestBed.get(UserService);在beforeEach中检索它。它接受存根并将其转换为服务,但不允许我更改值。我正在ngOnInit中创建一个访问该服务的属性。 -
是的,但是是什么让您认为更改服务中的值应该会影响模板,除非您直接在模板中访问服务。如果您根据服务中的值在组件中分配变量,这只是初始初始化,不会在服务更新时更新组件变量。您可能想考虑为您的服务使用主题并订阅组件中的值。
-
您预计何时再次调用
ngOnInit?输入console.log看看。 -
@peeskillet,您能否提供一个在我的组件中使用
Subject的示例。
标签: unit-testing angular stub injectable