Asp.net mvc 3 模拟通用存储库方法
为了对我的asp.net MVC web应用程序进行单元测试,我想模拟我的IGenericRepository(我正在使用Moq) 必须模拟的方法如下所示:Asp.net mvc 3 模拟通用存储库方法,asp.net-mvc-3,linq,lambda,mocking,moq,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>>
IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
我认为我的第二个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;
}
}
private bool validateUser(用户帐户)
{
尝试
{
Useraccount useraccountLogin=UnitOfWork.UseraccountRepository.Get(
u=>u.Email==useraccount.Email&&u.Password==useraccount.Password).Single();
返回(useraccountLogin!=null);
}
捕获(异常exc)
{
返回false;
}
}
我的错误在哪里
先谢谢你。
Michael根据这个问题,Moq不支持对表达式参数设置约束。什么不起作用,引发了什么异常?你像专业人士一样在细节上游刃有余……很抱歉把你弄糊涂了。如果在我的单元测试中调用validateUser(…)-方法(从控制器方法内部),它会在调用UseraccountRepository.Get(…)时引发异常:[System.InvalidOperationException]={“序列不包含元素”}。“在System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)\r\n at…”。我发现并至少起作用的是:useraccountRepository.Setup(r=>r.Get(It.IsAny(),null,”)。返回(useraccounts);有没有更好的方法,或者这已经是模仿我展示的存储库方法的最好方法了?我认为这是你最好的选择。但是,当您需要用不同的表达式模拟两个不同的调用时,显然会遇到问题。不过,我会考虑废除通用回购协议。许多专家认为这是一种反模式,部分原因是测试性差。谢谢您的帮助。您的链接将我带到了正确的轨道。:)
useraccountRepository.Setup(r => r.Get(u => u.Email == useraccount.Email
&& u.Password == useraccount.Password, null, "")).Returns(useraccounts);
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;
}
}