【问题标题】:Using stubs also as mocks使用存根也作为模拟
【发布时间】:2014-09-17 13:31:28
【问题描述】:

我有一个类说 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);
    }

我有单独的测试来检查事件是否被正确引发,但我担心在我的假存储库上断言是否正确,或者,如果存储库充当存根,然后我应该断言事件是否是提高。似乎测试关注的是被测方法的内部,如果它是正确的,我不会。

【问题讨论】:

    标签: c# unit-testing xunit.net


    【解决方案1】:

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

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

    在当前状态下,您的测试看起来还不错(在单个测试中将组件用作存根和模拟并不少见)。考虑到以上几点,我会将JoinRoom 更改为:

    void JoinRoom(Room room, UserConnectionInfo userConnectionInfo)
    

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

    void JoinRoom(Room room, User user)
    

    【讨论】:

    • 感谢@jimmy_keen 我将不得不重新审视这个功能,因为该方法的作用超出了它的建议。
    猜你喜欢
    • 2014-05-05
    • 2015-12-17
    • 1970-01-01
    • 2012-10-03
    • 2010-11-20
    • 1970-01-01
    • 2015-11-20
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多