【发布时间】:2020-09-21 00:40:24
【问题描述】:
我有一个组件使用的数据服务。
例如:
图书服务:
...
private book: Book;
private bookSubject = new BehaviorSubject<Book>(this.book);
bookChanged = this.bookSubject.asObservable();
...
书籍组件:
...
book: Book;
ngOnInit() {
this.bookService.bookChanged.subscribe(
(book: Book) => this.book = book;
)
}
...
组件的规格(测试文件):
describe('BookComponent', () => {
let component: BookComponent;
let fixture: ComponentFixture<BookComponent>;
let bookServiceStub: Partial<BookService>;
bookServiceStub = {
bookChanged: of({id: 123, name: 'Book 1'})
};
beforeEach(async(() => {
TestBed
.configureTestingModule({
declarations: [BookComponent],
providers: [
{provide: BookService, useValue: bookServiceStub},
...
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(BookComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should change the book with a new one', fakeAsync(() => {
const newBook = {
id: 769,
name: 'Book 2'
};
bookServiceStub.bookChanged = of(newBook);
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(component.book.id).toBe(newBook.id); // FAILS (still has old value)
expect(component.book).toBe(newBook); // FAILS (still has old value)
});
}));
});
所以测试失败是因为“book”变量没有用新值更新。
我在这里做错了什么?
注意:我实际上想测试组件中的订阅是否按预期工作!
原因:我想进一步测试一下,当服务中的值更新时,DOM 是否会自动更改
【问题讨论】:
-
另外,我已经尝试添加tick(),但仍然没有成功。
-
'应该换一本新书':这是对服务的测试还是对组件的测试?如果要测试组件(逻辑),可以设置book:component.book = newBook; fixture.detectChanges();
-
好点@Marc!但我实际上想测试组件中的订阅是否按预期工作!原因:我想进一步测试一下,当服务中的值更新时,DOM 是否会自动更改
-
听起来这是一个很好的端到端测试候选者:测试组件和服务。
-
@Marc 也许,但这将涉及我想避免的实际 API 调用。同样根据 Angular 的测试文档:angular.io/guide/testing#async-observables。这种东西是可以测试的,我就是想知道我做错了什么。
标签: angular unit-testing jasmine karma-jasmine angular-test