如何为单元测试正确模拟数据对象?

How to properly mock data object for unit tests?

我正在尝试对类似于下面代码片段的代码块进行单元测试。

const getSubscriptions = {
     options: {
         async handler({query}) {
             const workType = searchParams.get('workType');

             return axios.get(url, {
                 headers: {
                     Authorization: `Bearer ${clientCredentials.access_token}`
                 }
             }).then((response) => {
                 if (workType && workType.length > 0) {
                     if (workType === 'Unknown') {
                         response.data._embedded = response.data._embedded.filter((subscriptions) => !subscriptions.systemProperties.workType);
                     } else {
                         response.data._embedded = response.data._embedded.filter((subscriptions) => subscriptions.systemProperties.workType && subscriptions.systemProperties.workType === workType);
                     }
                 }

                 return response.data;
             })
         }
     },
method: 'GET',
path: '/subscriptions'};

添加 .filter 用法后,我在现有测试中看到诸如“无法读取未定义的 属性 'filter'”之类的错误。我怎样才能在我的单元测试中正确地模拟这个,以便过滤器被识别为一个函数?目前,测试正在传递一个如下所示的数据对象:

data: [chance.object(), chance.object()]

我尝试编辑此数据对象以包含 _embedded,然后我收到一个错误,指出 .filter 不是一个函数。

我刚开始为 JavaScript 编写单元测试,所以我已经坚持了一段时间。任何帮助表示赞赏。我正在使用 Mocha 进行测试,但也可能会解释 Jasmine 或 Jest 解决方案。

这是测试套件的精简版:

describe('Get subscriptions', () => {
    const workType = chance.word();

    const getSubscriptionsResponse = {
        data: [chance.object(), chance.object()]
    };

    const expectedRequest = {
        auth: {
            ...expectedAuth
        },
        path: '/subscriptions',
        query: {
            workType
        }
    };

    it('should call API with auth token for Subscriptions', async () => {
        const axiosStub = sinon.stub(axios, 'get').resolves(getSubscriptionsResponse);
        const expectedParams = new URLSearchParams(expectedRequest.query);

        await getSubscriptionsRoute.options.handler(expectedRequest);

        expect(axiosStub).to.have.callCount(1);
        expect(axiosStub).to.be.calledWith(expectedUrl, {
            headers: {
                Authorization: `${accessToken}`
            }
        });
    });

代码试图过滤 response.data._embedded 数组 — response.data 是一个对象。您应该将响应数据模拟为对象(使用 _embedded 属性)而不是数组。

{
  data: [chance.object(), chance.object()]
}

应该是

{
  data: {
    _embedded: [
      // ...
    ]
  }
}