【发布时间】:2013-02-18 17:54:06
【问题描述】:
为了对我的 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;
}
}
我的错误在哪里?
提前谢谢你。 迈克尔
【问题讨论】:
-
什么不起作用并且抛出哪个异常?您可以像专业人士一样浏览细节......
-
很抱歉让您感到困惑。如果在我的单元测试中调用了 validateUser(...) 方法(从控制器方法内部),它会抛出一个异常,其中调用了 UseraccountRepository.Get(...):[System.InvalidOperationException] = {"Sequence contains no元素”}。 " 在 System.Linq.Enumerable.Single[TSource](IEnumerable`1 源)\r\n 在 ..."。
标签: asp.net-mvc-3 linq lambda mocking moq