如何使用Moq传递List参数

本文关键字:List 参数 传递 Moq 何使用 | 更新日期: 2023-09-27 18:22:41

我正在尝试模拟一个使用两个参数的方法,该方法的签名如下:

User DoSomething(User user, List<Role> newRoleList);

只有当"newRoleList"参数中包含一些预定义的角色和特定的用户名时,我才希望此方法返回一些内容。因此,我尝试使用It.Is<>,而不是使用It.IsAny<>。我面临的问题是第二个参数。如何设置第二个参数?

我正在努力实现这样的目标:

    List<Role> roleList = new List<Role>()
        {
            new Role() { RoleName="RoleOne"}, 
            new Role() { RoleName="RoleTwo"}
        };
    
    mockComponent.Setup(x => x.UpdateUserRoles(
                                It.Is<User>(user1 => user1.UserName == "DummyUser"), 
                                It.Is<List<Role>>(y=>y==roleList)
                        ))
                 .Returns(user);

但这总是返回"null"。如果我将第二个参数更改为It.IsAny<List<Role>>(),那么它将返回一个适当的值。

请建议如何实现这一点,有没有更好的方法来提供特定的列表作为参数或什么?

如何使用Moq传递List参数

最后我找到了解决方案,我需要在设置中指定如何平等对待两个列表的标准。

我已将代码更改为:

mockComponent
 .Setup(
    x => x.UpdateUserRoles(
              It.Is<User>(user1 => user1.UserName == "DummyUser"),
              It.Is<List<Role>>(y=>y[0].RoleName=="RoleOne" && y[1].RoleName=="RoleTwo")))
           .Returns(user);

它就像一个符咒。。