模拟通用存储库方法

时间:2013-02-18 17:54:07

标签: asp.net-mvc-3 linq lambda mocking moq

对我的asp.net MVC Web应用程序进行单元测试,我想模拟我的IGenericRepository(我正在使用Moq)。

必须模拟的方法如下所示:

IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, 
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");

我已经毫无问题地模拟了存储库:

useraccountRepository = new Mock<IGenericRepository<Useraccount>>();

现在我想告诉Moq,当调用我的接口的Get方法时,应该返回一个useraccounts列表:

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email && u.Password == useraccount.Password)).Returns(useraccounts);

我认为我的第二个lambda中有一个错误,因为这个有效:

useraccountRepository.Setup(r => r.Get(null, null, "")).Returns(useraccounts);

但是我的错误在哪里?

什么也有效:

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email 
            && u.Password == useraccount.Password, null, "")).Returns(useraccounts);

看起来默认参数值不适用于我的模拟。那是为什么?

如果我使用

useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email 
            && u.Password == useraccount.Password, null, "")).Returns(useraccounts);
无论如何,然后我的控制器中的方法在调用Get消息时抛出异常:

private bool validateUser(Useraccount useraccount)
    {
        try
        {
            Useraccount useraccountLogin = UnitOfWork.UseraccountRepository.Get(
                u => u.Email == useraccount.Email && u.Password == useraccount.Password).Single<Useraccount>();

            return (useraccountLogin != null);
        }
        catch (Exception exc)
        {
            return false;
        }            
    }

我的错误在哪里?

提前谢谢你。 迈克尔

1 个答案:

答案 0 :(得分:0)

根据这个问题Moq.Mock<T> - how to setup a method that takes an expression,Moq不支持设置表达式参数的约束。