如何为单元测试正确模拟数据对象?
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: [
// ...
]
}
}
我正在尝试对类似于下面代码片段的代码块进行单元测试。
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: [
// ...
]
}
}