将存根也用作mock

本文关键字:mock 存根 | 更新日期: 2023-09-27 18:22:08

我有一个类,比如ChatService,还有一个名为JoinRoom()的方法,它返回void。此方法将用户及其连接详细信息作为参数,并将用户与其连接详细信息一起保存到数据库中;或者,如果用户已存在于数据库中,则将用户的连接详细信息添加到数据库中,然后根据任何一种情况引发事件。我想测试一下这种方法:

  1. 保存新用户及其连接详细信息(针对新用户)
  2. 保存现有用户的连接详细信息
  3. 当上述任一操作成功时引发事件

我有一个测试,可以检查用户及其连接是否正确保存,还可以检查事件是否正确引发。示例:

    [Fact]
    public void user_should_be_created_and_added_to_the_room_if_user_does_not_exist()
    {
        chatService.JoinRoom(validConnectionId, validRoom, validUsername);
        Assert.False(userExist);
        Assert.True(repository.AddUserCalled);
    }
    [Fact]
    public void then_connection_should_be_added_for_an_existing_user()
    {
        repository.AddUser(new User(validUsername, userpix));
        repository.AddUserCalled = false;
        chatService.JoinRoom(validConnectionId, validRoom, validUsername, userpix);
        Assert.False(repository.AddUserCalled);
        Assert.True(repository.ConnectionAdded);
        Assert.Equal(1, repository.NoOfConnectionAdded);
    }

我有一个单独的测试来检查事件是否被正确引发,但我担心的是,在我的假存储库上断言是正确的,还是存储库应该充当存根,然后我应该断言事件是否被引发。测试似乎关注的是被测试方法的内部结构,如果这是正确的,我不这么认为。

将存根也用作mock

您的问题缺乏关于如何使用JoinRoom的上下文,但仍然很少出现问题:

  • 为什么JoinRoom会创建用户?用户创建与加入聊天室有什么关系?在加入聊天室之前,你不应该已经是某种用户了吗?(也许新用户会匿名加入)?我会重新访问此功能
  • connectionId和userName听起来都像连接用户的标识属性;当上面的用户创建问题得到解决时(您不应该同时需要这两个问题),就可以解决这个问题
  • 你使用(看起来像)手动模拟而不是库生成的(Moq,FakeItEay)有什么原因吗

在当前状态下,您的测试似乎还可以(在单个测试中同时使用组件作为存根和mock并不罕见)。考虑到以上几点,我将JoinRoom更改为:

void JoinRoom(Room room, UserConnectionInfo userConnectionInfo)

或者(这需要在内部某处提取连接):

void JoinRoom(Room room, User user)