【发布时间】:2020-04-16 04:15:52
【问题描述】:
我正在测试一个 Node.js 应用程序,其中地址使用 Sequelize 存储在 Postgresql 数据库中。为了测试“getAll()”函数,我编写了一个执行以下操作的测试(见下文): 1.创建两个地址,并存储它们(Sequelize的'create'函数) 2.调用getAll()函数 3.(尝试)断言返回的数组包含创建的地址,使用expect.arrayContaining()
我在没有 Sequelize 的情况下测试了相同的设置(将数字/对象添加到数组并以与我在这里相同的方式匹配子集),效果很好。
it("Should get all addresses", async () => {
const address_1 = await Address.create({
street: VALID_STREET,
number: VALID_NUMBER,
city: VALID_CITY,
country: VALID_COUNTRY
});
const address_2 = await Address.create({
street: "street 2",
number: "2",
city: "City 2",
country: "Country 2"
});
const allAddresses = await controller._getAll();
expect(allAddresses).toEqual(
expect.arrayContaining([address_1, address_2])
);
});
我预计测试会成功,但它失败了,给了我这个错误消息,其中包含两个完全相同的数组,除了“ArrayContaining”部分。
expect(received).toEqual(expected) // deep equality
Expected: ArrayContaining [{"city": "A city", "country": "Belgium", "createdAt": 2019-08-21T14:05:23.063Z, "fullAddress": "valid street 123 A, A city, Belgium", "id": 296, "number": "123 A", "postalCode": null, "street": "valid street", "updatedAt": 2019-08-21T14:05:23.063Z}, {"city": "City 2", "country": "Country 2", "createdAt": 2019-08-21T14:05:23.066Z, "fullAddress": "street 2 2, City 2, Country 2", "id": 297, "number": "2", "postalCode": null, "street": "street 2", "updatedAt": 2019-08-21T14:05:23.066Z}]
Received: [{"city": "A city", "country": "Belgium", "createdAt": 2019-08-21T14:05:23.063Z, "fullAddress": "valid street 123 A, A city, Belgium", "id": 296, "number": "123 A", "postalCode": null, "street": "valid street", "updatedAt": 2019-08-21T14:05:23.063Z}, {"city": "City 2", "country": "Country 2", "createdAt": 2019-08-21T14:05:23.066Z, "fullAddress": "street 2 2, City 2, Country 2", "id": 297, "number": "2", "postalCode": null, "street": "street 2", "updatedAt": 2019-08-21T14:05:23.066Z}]
那么,有谁知道如何解决这个问题?这是 Sequelize 问题,还是我在这里遗漏了什么?
编辑: 对于遇到同样问题的人,我确实有一个解决方法,即使用 array.some() 函数,但这似乎太冗长了,我觉得应该使用 expect.arrayContaining() 函数.
expect(
allAddresses.some(address => {
address.id === address_2.id &&
address.street === address_2.street &&
address.number === address_2.number &&
address.city === address_2.city &&
address.country === address_2.country;
})
);
【问题讨论】:
-
介意分享
controller._getAll()的作用吗? -
我还问自己为什么在这里使用
arrayContaining而不是expect(allAddresses).toEqual([address_1, address_2])。你添加了两个元素,你想从_getAll得到这两个元素,不是吗? -
当然; _getAll() 方法实际上只是 sequelize 的 findAll() 函数的一个包装器,它以特定于应用程序的方式处理错误,但不会更改返回的数据。至于你的第二个问题:我试过了,但得到了这个错误:
Compared values serialize to the same structure. Printing internal object structure without calling `toJSON` instead。然后我尝试将它们转换为 JSON,但这也不起作用(结果与原始问题中的错误相同,除了所有引号都被转义了) -
您在
findAll查询中使用raw: true吗? sequelize.org/master/manual/models-usage.html#raw-queries -
感谢您的建议。我只是尝试过,但没有解决它。
标签: arrays node.js jestjs sequelize.js