使用List <int>作为参数模拟一个方法并返回List&lt;&gt;与Moq </int>

时间:2013-04-03 14:21:51

标签: c# .net mocking moq

在我的测试中,我将数据定义为List<IUser>,其中包含一些记录。

我想为方法GetList设置moq,此方法接收List<int>作为参数。这是一个ID列表;我想在List<IUser>

中返回带有这些ID的IUser列表

我尝试了这个,但是我没有找到正确的返回语法

Mock<IUsers> mockUserRepository = new Mock<IUsers>();
_mockUserRepository.Setup(m => m.GetListAll(It.IsAny<List<int>>())).Returns(????????);

我试过这样的事情:

_mockUserRepository.Setup(m => m.GetListAll(It.IsAny<List<int>>())).Returns(u =>_users.Contains(???));

谢谢,

class User : IUser
{
    public int Id { get; set; }
    public string Firsname { get; set; }
    public string Lastname { get; set; }
}

interface IUser
{
    int Id { get; set; }
    string Firsname { get; set; }
    string Lastname { get; set; }
}

interface IAction
{
    List<IUser> GetList(List<int> listId);
}

class Action : IAction
{

    public List<IUser> GetList(List<int> listId)
    {
        //....
    }
}

3 个答案:

答案 0 :(得分:9)

试试这个:

mock.Setup(users => users.GetListAll(It.IsAny<List<int>>()))
            .Returns<List<int>>(ids =>
                {
                    return _users.Where(user => ids.Contains(user.Id)).ToList();
                });

答案 1 :(得分:0)

只需返回准备好的清单:

_mockUserRepository.Setup(m => m.GetListAll(It.IsAny<List<int>>())).Returns(_users);

答案 2 :(得分:0)

如果您将多个参数作为一个过滤器参数,则可以使用此示例

mock.Setup(o => o.GetListAllAsync(It.IsAny<List<int>>(), It.IsAny<string>())
 .ReturnsAsync((int[] ids, string firstname) =>
 {
   return _users
          .Where(user => ids.Contains(user.Id) && user.Firstname.Equals(firstname))
          .ToList();
 });