Как Жасмин проверить асинхронную функцию - PullRequest
0 голосов
/ 29 ноября 2018

Я ужасен в асинхронности в целом.Я прочитал все остальные ответы, но они не помогли мне понять это.Вот код, который я пытаюсь проверить:

$("#do").click(function() {
  someFunction().then(function(result) {
    if (result.error) {
      failureFunction(result.error_message)
    } else {
      successFunction(result.token)
    }
  })
})

someFunction() - это асинхронная функция, которая будет возвращать либо {error: true, error_message: "failed due to error"}, либо {token:"success token"}.

Я бы хотел проверитьчто обе ветви работают, то есть, что failureFunction и successFunction вызываются соответствующим образом с правильными аргументами.

Вот мой Жасмин:

describe("calling someFunction", function() {
  describe("when result is good", function() {
    beforeEach(function() {
      spyOn(window, "successFunction")
      response = Promise.resolve({token: "asdf"});
      spyOn(window, "someFunction").and.returnValue(response)
      $("#do").trigger("click")
    })
    it("should call successsFunction appropriately", function(){
      expect(window.successFunction).toHaveBeenCalledWith("asdf")
    })
  })
  // ... once I get above to pass it's just emulating with failureFunction
})

Ошибка, которую я получаю при запуске:

TypeError: Cannot read property 'then' of undefined

Так что я предполагаю, что заглушен returnValue из someFunction (то есть response) не является объектом обещания, для которого можно вызвать .then ... но мне это кажется правильным?

1 Ответ

0 голосов
/ 30 ноября 2018

Проблема заключалась в том, что ожидание в it выполнялось ДО того, как асинхронная функция, которую я сменил, закончила разрешать.Таким образом, решение состоит в том, чтобы обернуть ожидания в аналогичный .then.Это сработало:

it("should call successsFunction appropriately", function(){
  response.then(function() {
    expect(window.successFunction).toHaveBeenCalledWith("asdf")
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...