Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 模拟通用存储库方法_Asp.net Mvc 3_Linq_Lambda_Mocking_Moq - Fatal编程技术网

Asp.net mvc 3 模拟通用存储库方法

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

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

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

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