1

为了对我的 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 方法被调用时,应该返回一个用户帐户列表:

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;
        }            
    }

我的错误在哪里?

先感谢您。迈克尔

4

1 回答 1

0

According to this question Moq.Mock<T> - how to setup a method that takes an expression, setting constraints on expression parameters is unsupported by Moq.

于 2013-02-18T18:36:52.173 回答