Почему эта функция не вызывается в Jest тестах? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь проверить функцию в Реагировать , используя Jest .Он отлично работает в среде производства и разработки, но Jest говорит, что он не называется. Как следствие, состояние в тесте возвращает 0 длин данных, в то время как оно должно быть 1!

Это функция:

  addStory(story) {
const idToken = this.state.user.idToken
if (!idToken) return
const storyProps = {
  Title: story.title,
  Body: story.body,
  UserEntityKey: story.userEntityKey,
  AuthorName: this.state.user.displayName,
  AuthorPicture: this.state.user.photoURL
}

// Axios call should return Promise result for proper testing.
const promise = Axios.post(apiUrl, storyProps, { headers: { 'Authorization': idToken } })
promise.then(res => res.data)
promise.then(newStory => {
  newStory.data.AuthorName = this.state.user.displayName
  newStory.data.AuthorPicture = this.state.user.photoURL
  this.setState(({ data }) => {
    data.unshift(newStory.data)
    return { data: data, isAddStoryVisible: false }
  })
})
promise.catch((error) => {
  console.error(error)
})
return promise

};

а это тест:

let story = {
  Title: "title 1",
  body: "body 1",
  UserEntityKey: "userEntityKey",
  Key: "storyKey",
}

test('Story adds based on mocked backend response', async () => {
  MockAxios.post.mockImplementationOnce(() =>
    Promise.resolve(story)
  )

  const storyApp = shallow(<StoryApp />);

  // Test without idToken
  // Axios call should return Promise result.
  await storyApp.instance().addStory(story)
  expect(storyApp.state().data.length).toEqual(0)

  storyApp.setState((prev) => {
    prev.user = {
      idToken: "asdf",
      displayName: "Test name",
      photoURL: "Test photo"
    }
    return prev
  })

  // Test with idToken
  await storyApp.instance().addStory(story)
  expect(storyApp.state().data.length).toEqual(1)
})

и, наконец, вот тестовый вывод:

  ● Story adds based on mocked backend response

expect(received).toEqual(expected)

Expected value to equal:
  1
Received:
  0

  92 |   // Test with idToken
  93 |   await storyApp.instance().addStory(story)
> 94 |   expect(storyApp.state().data.length).toEqual(1)
     |                                        ^
  95 | })
  96 | 
  97 | test('Story deletes based on mocked backend response', async () => {

  at Object.toEqual (__tests__/App.test.js:94:40)
  at tryCatch (node_modules/regenerator-runtime/runtime.js:62:40)
  at Generator.invoke [as _invoke] (node_modules/regenerator-runtime/runtime.js:288:22)
  at Generator.prototype.(anonymous function) [as next] (node_modules/regenerator-runtime/runtime.js:114:21)
  at asyncGeneratorStep (__tests__/App.test.js:25:103)
  at _next (__tests__/App.test.js:27:194)

Спасибо: -)

1 Ответ

0 голосов
/ 01 марта 2019

Похоже, это просто опечатка.

Измените, как вы издеваетесь MockAxios.post на это:

MockAxios.post.mockImplementationOnce(() =>
  Promise.resolve({ data: story })
)

... и это должно сработать.

...