【问题标题】:Can I use `expect.stringContaining()` inside a Jest `.toHaveBeenCalledWith()` block?我可以在 Jest `.toHaveBeenCalledWith()` 块中使用 `expect.stringContaining()` 吗?
【发布时间】:2020-05-03 23:59:55
【问题描述】:

是否可以在 Jest .toHaveBeenCalledWith() 块中使用 expect.stringContaining()

我目前正在使用:

expect(createChatRoomMock).toHaveBeenCalledWith({
  creatorId: expect.stringContaining("user_"),
  chatRoomUuid: expect.stringContaining("chatRoom_"),
});

但这失败了:


    - Expected
    + Received


    Object {
  -   "chatRoomUuid": StringContaining "chatRoom_",
  -   "creatorId": StringContaining "user_",
  +   "chatRoomUuid": "chatRoom_sZ9nj4hC46e4bGz4PjYzpC",
  +   "creatorId": "user_nCQsasvYirUwwoEr3j8HsC",
    },

这很奇怪,从错误中可以看出,收到的字符串与预期的匹配

我也试过了:

expect(createChatRoomMock).toHaveBeenCalledWith({
  creatorId: expect.stringMatching(/user_.*/),
  chatRoomUuid: expect.stringMatching(/chatRoom_.*/),
});

结果与上图相同。

如何在 Jest .toHaveBeenCalledWith() 块中使用 expect.stringContaining()

【问题讨论】:

    标签: javascript testing jestjs


    【解决方案1】:

    这是bug in jest。如果还有其他测试失败,Jest will show these as failures, even though they would pass,例如:

      it.only("Test", () => {
        var createChatRoomMock = jest.fn();
    
        createChatRoomMock({
            "chatRoomUuid": "chatRoom_sZ9nj4hC46e4bGz4PjYzpC",
            "creatorId": "user_nCQsasvYirUwwoEr3j8HsC",
            "somethingElse": "bad"
        });
    
        expect(createChatRoomMock).toHaveBeenCalledWith({
          creatorId: expect.stringContaining("user_"),
          chatRoomUuid: expect.stringContaining("chatRoom_"),
          somethingElse: expect.stringContaining("good")
        });
      });
    

    会(不准确地)显示另一个 .toHaveBeenCalledWith() 失败了:

        - Expected
        + Received
    
          Object {
        -   "chatRoomUuid": StringContaining "chatRoom_",
        -   "creatorId": StringContaining "user_",
        -   "somethingElse": StringContaining "good",
        +   "chatRoomUuid": "chatRoom_sZ9nj4hC46e4bGz4PjYzpC",
        +   "creatorId": "user_nCQsasvYirUwwoEr3j8HsC",
        +   "somethingElse": "bad",
          },
    

    【讨论】:

      【解决方案2】:

      是的,应该可以。我写了以下测试并通过了:

      test("Test", () => {
          var createChatRoomMock = jest.fn();
      
          createChatRoomMock({
              "chatRoomUuid": "chatRoom_sZ9nj4hC46e4bGz4PjYzpC",
              "creatorId": "user_nCQsasvYirUwwoEr3j8HsC"
          });
      
          expect(createChatRoomMock).toHaveBeenCalledWith({
            creatorId: expect.stringContaining("user_"),
            chatRoomUuid: expect.stringContaining("chatRoom_"),
         });
      });
      

      我能建议的唯一事情是:

      • 检查输出中的隐藏字符,例如 Unicode 零宽度空格,
      • 如果您使用的不是最新版本的 Jest,请尝试更新。我使用的是 25.5.2 版本,这是撰写本文时可用的最新版本。

      【讨论】:

      • 我可以支持它并且它可以工作。刚写了一个类似的,我也通过了测试。
      • 感谢卢克和萨曼斯!知道您无法重现它是找出问题的关键——事实证明,当预期只有一个键时,Jest 会报告所有错误。我在 Jest 中提交了一个错误,并在上面的答案中添加了更多详细信息。再次感谢!
      • @mikemaccana:很高兴您找到了解决问题的方法。但是,请不要通过添加您的解决方案来对我的答案进行实质性编辑。相反,请在解决方案中发布您自己的答案。
      • 嗨@lukewoodward!我想将解决问题的相关部分添加到您的答案中,因为我想给您要点。您是否完全确定您希望我将其添加到单独的答案中并接受该新答案?
      • @mikemaccana:是的,我完全确定这一点,原因很简单,我没有写你添加的部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2013-08-14
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多