Угловой компонент
public setupObservables() {
this.formFieldChanged$ = this.formField
.valueChanges
.pipe(
debounceTime(100),
distinctUntilChanged((a, b) => a === b),
)
}
Жасмин Тест
import { of } from 'rxjs';
import { marbles } from 'rxjs-marbles/jasmine';
...
it('should update value on debounced formField change', marbles(m => {
const values = { a: "1", b: "2", c: "3" };
const fakeInputs = m.cold('a 200ms b 50ms c', values);
const expected = m.cold('100ms a 250ms c', values);
// works on stackblitz but otherwise gives TS2540 compiler error
// cannot assign to a read-only property
component.formField.valueChanges = fakeInputs;
component.setupObservables();
m.expect(component.formFieldChanged$).toBeObservable(expected);
}));
Намерение состоит в том, чтобы использовать мраморные тесты для тестирования Observable
кода в контексте с реактивными формами Angular.
- Имеет ли смысл такой подход?
- Как лучше всего высмеять
valueChanges
объектаFormField
? - Есть ли лучший способ структурировать такие тесты?
valueChanges
- это субъект, излучающий значения. Сравнивая его сfakeInputs
, вы не сравниваете отдельные выбросы. Вместо этого вам понадобитсяexpectObservable
github. com / ReactiveX / rxjs / blob / master / docs_app / content / guide / - person martin   schedule 17.04.2020component.formField.valueChanges = fakeInputs
вместо spyOn работает. - person Vedran   schedule 21.04.2020const expected = '100ms a 500ms c';
, а затем передаваяvalues
вtoBeObservable
. - person martin   schedule 21.04.2020valueChanges
является свойством только для чтения. - person Vedran   schedule 24.04.2020(component.formField as any).valueChanges = fakeInputs
. - person martin   schedule 24.04.2020