Vitest 误差 <functionName> 上<path>未定义导出



这里我有一个格式化从api获取的天气数据的函数,我想模拟这个api调用以具有一致的天气数据,仅测试纯格式化函数weatherApiController.ts

import { getWeatherData, formatWeatherData} from '../controller/weatherApiController'
import { describe, expect, vi, test } from 'vitest'

export async function formatWeatherData(start: String, end: String){
let data = await getWeatherData(start, end)
let formattedTemps = []
for(let i = 0; i < data.days.length; i++){
formattedTemps.push({datetime: data.days[i]['datetime'], tempmax: data.days[i]['tempmax'], tempmin: data.days[i]['tempmin']})
}
console.log(formattedTemps);

return formattedTemps
}

export async function getWeatherData(start: String, end: String) {
try{
let response = await fetch(`https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/Wermelskirchen/${start}/${end}?unitGroup=metric&include=days%2Ccurrent&key=<apiKey>&contentType=json`);
if(!response.ok){
throw new Error(`HTTP Error! Status: ${response.status}`);
}
let data = await response.json()
console.log(data);

return data
}catch(error){
console.error(error)
return null
}
}

weatherApiController.test.ts

test('mock3', async()=> {
let expected = [
{ datetime: '2023-03-12', tempmax: 10.4, tempmin: -0.2 },
{ datetime: '2023-03-13', tempmax: 15.4, tempmin: 9.1 }
]
vi.mock('../controller/weatherApiController.ts', async() => {
const actual = await vi.importActual("../controller/weatherApiController.ts")
return {
actual,
getWeatherData: async() => {
number: 3
},
formatWeatherData: async() => {
number:4
}
}
});
const result = await formatWeatherData('2023-03-12', '2023-03-13')
expect(result).toEqual(expected)
})

这是我得到的错误错误:[vitest] No "formatWeatherData"export是在"…/controller/weatherapiconcontroller .ts"模拟。你忘记从"vi.mock"归还了吗?如果你需要部分模拟一个模块,你可以使用"vi.importActual"内部:

谢谢你的帮助!

我尝试模拟API调用以获得一致的天气数据。我希望函数的返回值是常数。

我有一个类似的问题,我的模拟看起来像这样:

vi.mock('@/api/Client', () => {
const API = VueMocks.API
return API
})

和vitest在

上出错
Error: [vitest] No "default" export is defined on the "@/api/Client" mock. 
Did you forget to return it from "vi.mock"?
If you need to partially mock a module, you can use "vi.importActual" inside:
vi.mock("@/api/Client", async () => {
const actual = await vi.importActual("@/api/Client")
return {
...actual,
// your mocked methods
},
})

阅读最重要的文档,在vi.Mock下的最重要文档中有一个警告说:

警告

如果你要模拟一个带有默认导出的模块,你需要在返回的工厂函数对象中提供默认键。这是一个特定于ES模块的警告,因此是一个简单的文档可能会有所不同,因为jest使用CommonJS模块。例如,ts

vi.mock('./path/to/module.js', () => {   return {
default: { myDefaultKey: vi.fn() },
namedExport: vi.fn(),
// etc...   } })

在我实际的@/api/Client文件中,它是一个ts文件,它看起来像这样

export export class API { ... }
<Stuff>
export default new API(shallowReactive)

所以在我的情况下,除了我想要返回的模块之外,我还必须返回一个default

我必须这样做

vi.mock('@/api/Client', () => {
const API = VueMocks.API
return {
default: { ...API },
}
})

对我来说,VueMocks.API是一个我自己做的var对象,它指定了API已经需要的所有模拟。

在您的情况下,您可能必须执行类似

的操作。
vi.mock('../controller/weatherApiController.ts', async() => {
const actual = await vi.importActual("../controller/weatherApiController.ts")
return {
...actual,
getWeatherData: async() => {
number: 3
},
formatWeatherData: async() => {
number:4
}
}

由于上面文件中的导出是export async function formatWeatherData([...])export async function getWeatherData([...])

看起来你忘了添加...来复制实际的值,因为在你的return { actual应该是return { ...actual

相关内容

  • 没有找到相关文章

最新更新