首页 > 解决方案 > Jest spyOn mockReturnValue 正在返回未定义的值

问题描述

我有一个奇怪的错误,在使用 JestspyOn并模拟返回值时,该对象的值返回为未定义。

import { Location as LocationAPI } from '../index'
import REST from '../../MafRestApi'
const mockCoordinatesArray = [{'longitude': 116.0654299154163, 'latitude': -33.85910894972095, 'altitude': 1182.5}]

it('Calls the Location Coordinates API and gets a response', () => {
    jest.spyOn(REST, 'get').mockReturnValue(Promise.resolve(mockCoordinatesArray))
    return LocationAPI.getLocationCoordinates()
        .then((results) => {
            expect(results).toEqual(mockCoordinatesArray)
        })
})

这些LocationAPI.getLocationCoordinates()方法如下所示:

getLocationCoordinates (): Promise<Array<LocationCoordinates>> {
    return REST.get(`${ENDPOINTS.LOCATION}`)
        .then((coordinates) => coordinates.map((coordinate) => new LocationCoordinates(coordinate)))
}

spyOn是成功拦截。

Jest 的输出结果为:

Error: expect(received).toEqual(expected)

Expected value to equal: [{"altitude": 1182.5, "latitude": -33.85910894972095, "longitude": 116.0654299154163}]
Received:[{"altitude": undefined, "latitude": undefined, "longitude": undefined}]

我对另一个 API 调用使用了完全相同的签名,它工作正常。

为什么键会在值不完整的情况下保持完整?

标签: jestjs

解决方案


你的有问题getLocationCoordinatesgetLocationCoordinates没有返回coordinates您的代码中的映射。

尝试这个:

getLocationCoordinates(): Promise<Array<LocationCoordinates>> {
  return new Promise((resolve) => {
    REST.get(`${ENDPOINTS.LOCATION}`).then((coordinates) => {
      const mappedCoordinates = coordinates.map((coordinate) => new LocationCoordinates(coordinate))
      resolve(mappedCoordinates);
    });
  });
}

或使用async/await

async getLocationCoordinates(): Promise<Array<LocationCoordinates>> {
  const coordinates = await REST.get(`${ENDPOINTS.LOCATION}`);
  return coordinates.map((coordinate) => new LocationCoordinates(coordinate));
}

推荐阅读