【问题标题】:Jest compare object with arbitrary property value开玩笑将对象与任意属性值进行比较
【发布时间】:2019-02-23 05:52:12
【问题描述】:

我正在用 Jest 测试 rest API。我知道我们使用toEqual 通过递归比较所有属性来检查两个对象是否相等。

对于原始值toEqual 使用Object.is 进行比较。

问题

我遇到的问题是在测试/register 端点时。用户成功注册后,端点返回用户详细信息。使用详细信息包含电话、姓名、电子邮件等信息,在这种情况下更重要的是 user_id

现在,我正在尝试的是这样的:

const data = {
  sponsor_id: 'ROOT_SPONSOR_ID',
  phone: '9999999999',
  name: 'Joe',
  password: 'shhhhh'
};

// Some API call goes here which returns `body`

expect(body).toEqual({
  user_id, // <-- How to test value of this?
  sponsor_id: data.sponsor_id,
  phone: data.phone,
  name: data.name
});

我事先不知道user_id 字段的返回值是多少。我只知道这将是一个数字。现在它可以是任何数值,那么在这种情况下如何测试具有任何值或任何数值的对象属性?

我还想检查我是否发送了超出预期的任何额外数据(属性)。顺便说一句,使用toEqual 已经处理好了。

如果我的测试方法有缺陷,那么请给我一个更好的解释。

【问题讨论】:

  • objectContaining怎么样?
  • @skyboyer 在这种情况下,只会测试body 中的子集数据。

标签: javascript unit-testing jestjs integration-testing


【解决方案1】:

使用expect.any(Number) 确保user_idNumber

test('matches', () => {

  const data = {
    sponsor_id: 'ROOT_SPONSOR_ID',
    phone: '9999999999',
    name: 'Joe',
    password: 'shhhhh'
  };

  const user_id = Math.floor(Math.random() * 1000);
  const body = Object.assign(data, { user_id });

  expect(body).toEqual({
    user_id: expect.any(Number),  // user_id must be a Number
    sponsor_id: data.sponsor_id,
    phone: data.phone,
    name: data.name,
    password: data.password
  });  // SUCCESS

});

请注意,如果您想要更具体的匹配器,您可以使用 create your own 使用 expect.extends

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2020-04-30
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多