Ala*_*osz 4 unit-testing observable subject-observer karma-jasmine angular
我正在尝试测试组件中的主题更改,但覆盖范围从未进入订阅功能。
标题栏搜索.component.ts
export class TitlebarSearch implements OnInit {
@ViewChild('titleSearchInput') titleSearchInputEl: any;
@Input() inputValue: string;
@Output() searchText = new EventEmitter<string>();
searchChange: Subject<string> = new Subject<string>();
constructor(private renderer: Renderer) {
}
/**
* Waits a time before send the text to search
*
* @protected
* @memberof TitlebarSearch
*
*/
protected prepareSearchInput() {
this.searchChange.debounceTime(500).subscribe(value => {
this.searchText.emit(value);
});
}
/**
* Send the text to the searchChange Observable
*
* @param {string} text
* @memberof TitlebarSearch
*/
public doSubmit(text:string){
this.searchChange.next(text);
}
}
Run Code Online (Sandbox Code Playgroud)
标题栏搜索.component.spec.ts
describe('Titlebar Search tests', () => {
let fixture;
let titlebarComponent;
beforeEach(async(() => {
//Creates a UserService using a mock class
TestBed.configureTestingModule({
declarations: [TitlebarSearch],
imports: [FormsModule],
//CUSTOM_ELEMENTS_SCHEMA to solve html elements issues
schemas: [ CUSTOM_ELEMENTS_SCHEMA ],
providers: [Renderer]
}).compileComponents().then(() => {
fixture = TestBed.createComponent(TitlebarSearch);
titlebarComponent = fixture.componentInstance
});
}));
//specs
it('should send the text to detect the change', async((done) => {
const text = "Changed text";
titlebarComponent.doSubmit(text);
fixture.detectChanges();
titlebarComponent.searchChange.subscribe(textRecived => {
expect(textRecived).toEqual(text);
done();
})
}));
});
Run Code Online (Sandbox Code Playgroud)
doSubmit 方法在输入文本更改时调用。然后,prepareSearchInput 订阅该主题,以获取下一个带有 debounce 的内容并输出相同的文本。
我不知道测试中的错误在哪里,但是覆盖范围从来没有覆盖订阅代码。互联网上的例子对我没有帮助。
我遇到了同样的问题,但在这个线程中从 @jonrsharpe 得到了答案:Unit test Angular 2 service subject。
您需要在测试的早期、调用之前声明您的主题订阅next()。如果你像这样重新排序,它应该可以工作:
it('should send the text to detect the change', async((done) => {
titlebarComponent.searchChange.subscribe(textRecived => {
expect(textRecived).toEqual(text);
done();
})
const text = "Changed text";
titlebarComponent.doSubmit(text);
fixture.detectChanges();
}));
Run Code Online (Sandbox Code Playgroud)
根据约翰的说法,问题在于你的主题没有任何重播/缓冲行为。