javascript - 尝试用 Jest 制作一个简单的 Axios 模拟

标签 javascript node.js ecmascript-6 jestjs

我想了解 this example ,所以我尝试的第一件事是删除他的axiosConfig.js ,所以这个例子看起来更像我想解决的当前案例。但是我收到此错误

- Expected
+ Received

  Object {
+   "baseURL": "https://jsonplaceholder.typicode.com/albums",
    "method": "get",
    "url": "/3/photos?_limit=3",
  },

Number of calls: 1

  39 |         const photos = await getPhotosByAlbumID(3);
  40 |         expect(axios.request).toHaveBeenCalled();
> 41 |         expect(axios.request).toHaveBeenCalledWith({ method: 'get', url: '/3/photos?_limit=3' })
     |                               ^
  42 |         expect(photos.length).toEqual(3);
  43 |         expect(photos[0].albumId).toEqual(3)
  44 |     });
问题
谁能弄清楚如何修复失败的测试?
如果我删除 baseURL: 'https://jsonplaceholder.typicode.com/albums'来自 getPhotosByAlbumId() , 但是有 axios.request() 没有意义没有 baseURL .
我有它在线https://repl.it/@SandraSchlichti/jest-playground#index.js
index.js
const axios = require('axios');

const getPhotosByAlbumId = async (id) => {
    const result = await axios.request({
      baseURL: 'https://jsonplaceholder.typicode.com/albums',
      method: 'get',
      url: `/${id}/photos?_limit=3`
    });
    const { data } = result;
    return data;
};

module.exports = getPhotosByAlbumId;
index.spec.js
const axios = require('axios');
const getPhotosByAlbumID = require('./index');

jest.mock('axios', () => {
    return {
        baseURL: 'https://jsonplaceholder.typicode.com/albums',
        request: jest.fn().mockResolvedValue({
            data: [
                {
                    albumId: 3,
                    id: 101,
                    title: 'incidunt alias vel enim',
                    url: 'https://via.placeholder.com/600/e743b',
                    thumbnailUrl: 'https://via.placeholder.com/150/e743b'
                },
                {
                    albumId: 3,
                    id: 102,
                    title: 'eaque iste corporis tempora vero distinctio consequuntur nisi nesciunt',
                    url: 'https://via.placeholder.com/600/a393af',
                    thumbnailUrl: 'https://via.placeholder.com/150/a393af'
                },
                {
                    albumId: 3,
                    id: 103,
                    title: 'et eius nisi in ut reprehenderit labore eum',
                    url: 'https://via.placeholder.com/600/35cedf',
                    thumbnailUrl: 'https://via.placeholder.com/150/35cedf'
                }
            ]
        })
    }
})

describe('test getPhotosByAlbumID ', () => {
    afterEach(() => jest.resetAllMocks());

    it('fetches photos by album id', async () => {
        const photos = await getPhotosByAlbumID(3);
        expect(axios.request).toHaveBeenCalled();
        expect(axios.request).toHaveBeenCalledWith({ method: 'get', url: '/3/photos?_limit=3' })
        expect(photos.length).toEqual(3);
        expect(photos[0].albumId).toEqual(3)
    });
});

最佳答案

因为在您的实现中,您正在调用 axios.request使用具有 baseURL 的对象,它与您的断言不匹配。
因此,您可以断言必须使用具有 baseURL 的对象调用它

expect(axios.request).toHaveBeenCalledWith({
    baseURL: "https://jsonplaceholder.typicode.com/albums",
    method: "get",
    url: "/3/photos?_limit=3",
});
或者调用该方法的对象必须具有以下两个属性:
expect(axios.request).toHaveBeenCalledWith(
    expect.objectContaining({ method: "get", url: "/3/photos?_limit=3" })
);
working example

关于javascript - 尝试用 Jest 制作一个简单的 Axios 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64787640/

相关文章:

javascript - jQuery 停止函数运行两次

javascript - 如何通过 socket.io 和滑动图 TableView 作为滑动窗口动态更新图表?

angularjs - Yeoman Angular 发生器误差

javascript - 使用传单路由机更改行程的颜色

javascript - JavaScript 中的继承和 Super

javascript - 安全问题: Parsing HTML with XMLHttpRequest?

javascript - D3 分类面积图 - 比例尺问题

node.js - 如何在 keycloak 中验证 token 并获取用户详细信息?

javascript - 如何解释结果(理解js中的let和var)

javascript - 在 WebGL 中批量调用的最快方法