#javascript #reactjs #jestjs #react-testing-library
Вопрос:
Я изучаю модульное тестирование с помощью Jest, это функция, которую я пытаюсь протестировать.
import axios from "axios";
export const call = async () => {
return axios.get("https://www.example.com").then((resp) =>{
const response = resp.data
let userData = {
title : response.title ? response.title : "",
url : response.url ? response.url : "",
date : response.date ? response.date : " ",
id : response.id ? response.id : "",
email: response.email ? response.email : ""
}
return Promise.resolve(userData)
})
}
вот это test.js файл —
import axios from "axios"
import {call} from './components/call'
jest.mock('axios')
const expectedResult = {
title:"hello"
}
const resp ={
data : expectedResult
}
describe("test", ()=>{
test("demo-test", async ()=>{
axios.get.mockResolvedValueOnce(resp)
const response = await call()
expect(response).toEqual(expectedResult)
console.log("axios.get() returns >>>", axios.get.mock.results[0]);
expect(axios.get).toHaveBeenCalledWith("https://www.example.com")
})
})
Вот ошибка, которую я получаю
expect(received).toEqual(expected) // deep equality
- Expected - 0
Received 4
Object {
"date": " ",
"email": "",
"id": "",
"title": "hello",
"url": "",
}
16 | axios.get.mockResolvedValueOnce(resp)
17 | const response = await call()
> 18 | expect(response).toEqual(expectedResult)
| ^
19 |
20 | console.log("axios.get() returns >>>", axios.get.mock.results[0]);
21 | expect(axios.get).toHaveBeenCalledWith("https://google.com")
FAIL src/call.test.js (7.597 s)
В call.js, когда данные пользователя не содержат троичных условий, тест проходит. Но когда я ставлю троичное условие, тест завершается неудачей с вышеуказанной ошибкой. Пожалуйста, помогите мне. Как решить эту проблему.
Комментарии:
1. Можем ли мы предположить, что «когда у userData нет троичных условий», означает, что каждое свойство выглядит примерно так
title : response.title
?2. В ваших
expectedResult
свойствахdate
,id
,url
undefined
в то время как вcall()
них есть пустая строка в качестве значения по умолчанию. Так почему же вы ожидаете, что тест пройдет успешно?3. @Cat да, так и будет
title : response.title
4. Какой из них правильно реализован, ваш тест или ваша функция? Если вы ожидаете, что свойства будут инициализированы как
undefined
, чем ваша реализация теста правильна, и вам нужно изменить своюcall()
реализацию, чтобы позволить тесту пройти. Если вы ожидаете, что они будут инициализированы как пустые строки, то ваша тестовая реализация неверна, и вам нужно изменитьexpectedResult
объект. Кстати, из вашего кода похожеdate
, что свойство на самом деле содержит пробел.5. Другим вариантом может быть то, что в своем тесте вы на самом деле не заботитесь о свойствах, отличных от
title
(я не знаю, что вы на самом деле пытаетесь здесь протестировать). Если это так, просто измените чек:expect(response.title).toEqual(expectedResult.title)