Я использую rx js epi c в качестве промежуточного программного обеспечения для асинхронного c действия в приложении Reaction-Redux.
Я пытаюсь смоделировать запрос ajax (через внедрение зависимостей) и протестируйте поведение этого epi c на основе ответа.
Это мой epi c:
export const loginEpic = (action$, store$, { ajax }) => { // Ajax method is injected
return action$.ofType(LoginActions.LOGIN_PENDING).pipe(
mergeMap(action => {
if (action.mail.length === 0) {
return [ loginFailure(-1) ]; // This action is properly returned while testing
} else {
return ajax({ ... }).pipe(
mergeMap(response => {
if (response.code !== 0) {
console.log(response.code); // This is logged
return [ loginFailure(response.code) ]; // This action is expected
} else {
return [ loginSuccess() ];
}
}),
catchError(() => {
return [ loginFailure(-2) ];
})
);
}
})
);
};
Эта часть теста, если почта адрес пустой и работает просто отлично (или, по крайней мере, так, как ожидалось):
it("empty mail address", () => {
testScheduler.run(({ hot, expectObservable }) => {
let action$ = new ActionsObservable(
hot("a", {
a: {
type: LoginActions.LOGIN_PENDING,
mail: ""
}
})
);
let output$ = loginEpic(action$, undefined, { ajax: () => ({}) });
expectObservable(output$).toBe("a", {
a: {
type: LoginActions.LOGIN_FAILURE,
code: -1
}
});
});
});
Однако у меня есть второй тест, который не проходит, потому что фактическим значением является пустой массив (нет возврата при неудачном входе) :
it("wrong credentials", () => {
testScheduler.run(({ hot, cold, expectObservable }) => {
let action$ = new ActionsObservable(
hot("a", {
a: {
type: LoginActions.LOGIN_PENDING,
mail: "foo@bar.com"
}
})
);
let dependencies = {
ajax: () =>
from(
new Promise(resolve => {
let response = {
code: -3
};
resolve(response);
})
)
};
let output$ = loginEpic(action$, undefined, dependencies);
expectObservable(output$).toBe("a", {
a: {
type: LoginActions.LOGIN_FAILURE,
code: -3
}
});
});
});
Любая идея о том, что я делаю неправильно / почему эта часть возвращает пустой массив (console.log
на самом деле регистрирует код):
if (response.code !== 0) {
console.log(response.code);
return [ loginFailure(response.code) ];
}
Пока это part возвращает заполненный массив:
if (action.mail.length === 0) {
return [ loginFailure(-1) ];
}