首页 > 解决方案 > 使用 Jest 匹配从 sequelize 返回的数组

问题描述

我正在测试一个 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}]

那么,有谁知道如何解决这个问题?这是续集问题,还是我在这里遗漏了什么?

编辑:对于遇到同样问题的人,我确实有一个解决方法,即使用 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;
    })
);

标签: arraysnode.jsjestjssequelize.js

解决方案


我认为比较整个模型不是一个好主意(那里有很多你不关心的东西)。试着比较一下dataValues。确保您不在通话中使用raw: truefindAll因为那样您就没有该dataValues属性。

const allAddresses = await controller._getAll();
const addressesPlain = allAddresses.map(address => address.dataValues);

expect([address_1.dataValues, address_2.dataValues]).toEqual(addressesPlain);

如果您对我写的小测试用例感兴趣:https ://pastr.io/view/QKNmua


推荐阅读