Так что я не могу быть полностью уверен, но я предполагаю, что у вас возникли проблемы из-за того, когда вы получите свой экземпляр эффектов (хотя я не очень знаком с Ngrx). Поскольку вы используете io c, экземпляр эффектов создается перед тем, как назначить значение для действий и перед изменением определения AccountsService
, поэтому ваш тестовый вид выглядит следующим образом:
it('should dispatch signInSuccess when a successful response is received', () => {
let accountsService: AccountsService = {
_signIn: () => of({ authenticated: true })
};
let actions;
let effects = new AccountEffects(actions, accountsService);
accountsService = {
_signIn: () => of({ authenticated: true })
};
actions = new ReplaySubject(1);
actions.next(AccountActions.signIn({ email, password }));
effects.signIn$.subscribe(result => {
expect(result).toEqual(AccountActions.signInSuccess({ email }));
});
});
Теперь Я не совсем уверен, почему он не видит эту первую _signIn
функцию. Я бы попытался записать значение accountsService
для консоли в вашем классе эффектов, чтобы увидеть, что происходит, но в любом случае вы столкнетесь с некоторыми проблемами, основанными на порядке, в котором вы определяете свои значения.
Итак, чтобы исправить ваш тест, я бы начал с назначения эффектов внутри теста, чтобы посмотреть, работает ли он. Затем вы можете настроить вещи так, как вам нужно, чтобы убедиться, что вы можете переопределить значения, когда захотите.
Так что-то вроде этого:
it('should dispatch signInSuccess when a successful response is received', () => {
actions = new ReplaySubject(1);
actions.next(AccountActions.signIn({ email, password }));
effects = TestBed.get(AccountEffects);
effects.signIn$.subscribe(result => {
expect(result).toEqual(AccountActions.signInSuccess({ email }));
});
});