将存根也用作mock
本文关键字:mock 存根 | 更新日期: 2023-09-27 18:22:08
我有一个类,比如ChatService
,还有一个名为JoinRoom()
的方法,它返回void。此方法将用户及其连接详细信息作为参数,并将用户与其连接详细信息一起保存到数据库中;或者,如果用户已存在于数据库中,则将用户的连接详细信息添加到数据库中,然后根据任何一种情况引发事件。我想测试一下这种方法:
- 保存新用户及其连接详细信息(针对新用户)
- 保存现有用户的连接详细信息
- 当上述任一操作成功时引发事件
我有一个测试,可以检查用户及其连接是否正确保存,还可以检查事件是否正确引发。示例:
[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);
}
我有一个单独的测试来检查事件是否被正确引发,但我担心的是,在我的假存储库上断言是正确的,还是存储库应该充当存根,然后我应该断言事件是否被引发。测试似乎关注的是被测试方法的内部结构,如果这是正确的,我不这么认为。
您的问题缺乏关于如何使用JoinRoom
的上下文,但仍然很少出现问题:
- 为什么
JoinRoom
会创建用户?用户创建与加入聊天室有什么关系?在加入聊天室之前,你不应该已经是某种用户了吗?(也许新用户会匿名加入)?我会重新访问此功能 - connectionId和userName听起来都像连接用户的标识属性;当上面的用户创建问题得到解决时(您不应该同时需要这两个问题),就可以解决这个问题
- 你使用(看起来像)手动模拟而不是库生成的(Moq,FakeItEay)有什么原因吗
在当前状态下,您的测试似乎还可以(在单个测试中同时使用组件作为存根和mock并不罕见)。考虑到以上几点,我将JoinRoom
更改为:
void JoinRoom(Room room, UserConnectionInfo userConnectionInfo)
或者(这需要在内部某处提取连接):
void JoinRoom(Room room, User user)