Проблемы при тестировании Epi c с TestScheduler - PullRequest
1 голос
/ 05 февраля 2020

Я использую 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) ];
      } 

1 Ответ

1 голос
/ 06 февраля 2020

Я предполагаю, что использование Promise приводит к тому, что тест на самом деле будет асинхронным. Попробуйте изменить заглушку ajax на of(response) вместо from

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...