Правильный способ превратить ваше компонентное событие в наблюдаемое, по-видимому, с помощью Subject
. Но вы можете переместить вызов next
в шаблон. См. Оператор RxJS fromEvent с выходным EventEmitter в Angular
Я изменил несколько вещей в вашем app.component
:
subject.next
в шаблон и подписка onFetch2 впоследствии на ngInit
tap
, если вы подписываетесь на одну и ту же точку в вашем приложении, просто выполните действия в subscribe
Относительно оптимального использования switchMap
I Я не совсем уверен, что вы ищете. Просто поместите switchMap
в pipe
там, где вам это нужно. Вы используете switchMap
правильно.
https://stackblitz.com/edit/zaggi-angular-switchmap-stackoverflow-6o2d9e
import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';
import { DataService } from './data.service';
import { Subject, Subscription, fromEvent } from 'rxjs';
import { switchMap, map, tap, takeUntil } from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, OnDestroy {
public onFetch2$ = new Subject();
private destroy$ = new Subject();
public data = 0;
constructor(private _ds: DataService) { }
public ngOnInit() {
this.onFetch2$.pipe(
switchMap(p => this._ds.getData()),
takeUntil(this.destroy$) // use takeUntil to unsubscribe
).subscribe(res => { // if you subscribe anyway you don't have to use tap
this.data = res;
console.log('<<< observable ', res)
});
}
public ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
public onFetch1(ev) {
// if getData is a HttpClient call you don't have to unsubscribe as they complete automatically
this._ds.getData().subscribe(res => {
this.data = res;
console.log('<<<', res); // <-- logs 10 times upon quick click succession
});
}
}
Я думаю, что можно сделать это с @Mock
аннотация. Из документов, @Mock(reentrant=true)
на Вашем ложном классе должен сделать это.
См. http://jmockit.googlecode.com/svn/trunk/www/javadoc/mockit/Mock.html
Поскольку пример смотрит здесь http://jmockit.googlecode.com/svn/trunk/www/tutorial/StateBasedTesting.html#reentrant
Я не протестировал это хотя..
Вместо того, чтобы добавить фиктивный объект Вы могли также разделить объект на подклассы, Вы хотите протестировать и переопределить методы, которые должны возвратить специальные значения.
Например:
RealClass toTest = new RealClass(){
public String foo(){
return "special value";
}
}
//use toTest in test
Путем хранения этого определения в тесте это также ясно для других, какие методы 'дразнят'.