【问题标题】:How to properly fake IQueryable<T> from Repository using Moq?如何使用 Moq 从存储库中正确伪造 IQueryable<T>?
【发布时间】:2012-10-15 21:08:25
【问题描述】:

我有一个类,它在它的构造函数中使用一个 IRepository,就像这样......

    public class UserService
    {
       public IRepository<User> _repo { get; set; }
       public UserService(IRepository<User> repo = null)
       {
        _repo = repo ?? new UserRepository();
       }

并且有一个看起来像这样的方法......

public bool IsUserActive(email string)
{
   //The method actually does more but to keep it simple lets imagine 
   // it does this
   User user = _repo.Find(u => u.Email == email).First();
   return user.IsActive;
}

IRepository 看起来像这样。

public interface IRepository<T> : IDisposable where T : IEntity
{
    void InsertOrUpdate(T entity);
    void Delete(T entity);
    IQueryable<T> Find(Func<T, bool> query);
    T Find(int id);
    void Save();
}

我想测试IsUserActive 方法,如果用户的IsActive 字段为假,则确保它返回假,反之亦然。

我正在尝试以下...

    [Test]
    public void IsUserActive_EmailThatWillReturnInactiveUser_ReturnsFalse()
    {
        //Arrange
        var fakeUserRepo = new Mock<IRepository<User>>();
        var query = new Func<User, bool>(u => u.Email == "AnyString");
        var listOfMatchingUsers = new List<User>() 
        {
                    new User 
                    { 
                        Email = "AnyString", 
                        IsActive = False 
                    }
        };
        IQueryable<User> queryableUsers = listOfMatchingUsers.AsQueryable();
        fakeUserRepo.Setup(r => r.Find(query)).Returns(queryableUsers);
        var userService = new UserService(fakeUserRepo.Object);

        //Act
        var result = userService.IsUserActive("AnyString");

        //Assert
        Assert.IsFalse(result);
    }

当我在 NUnit 中运行时,我在这一行收到错误“序列不包含元素”

var result = userService.IsUserActive("AnyString");

我哪里出错了?

【问题讨论】:

  • 以前从未使用过 AsQueryable,谢谢 :)

标签: c# unit-testing nunit moq


【解决方案1】:

将模拟设置更改为

fakeUserRepo.Setup(r => r.Find(It.IsAny<Func<User, bool>>()))
            .Returns(queryableUsers);

【讨论】:

  • 一些附加信息 - Moq 不支持表达式比较。有一种方法可以创建自定义匹配器来比较 ToString() 的表达式。但我真的不认为它值得;)
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
相关资源
最近更新 更多