Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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/6/entity-framework/4.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
C# 为什么该方法没有';但是,在另一种方法中,相同的算法可以工作吗?_C#_Entity Framework_Unit Testing_Moq_Return Value - Fatal编程技术网

C# 为什么该方法没有';但是,在另一种方法中,相同的算法可以工作吗?

C# 为什么该方法没有';但是,在另一种方法中,相同的算法可以工作吗?,c#,entity-framework,unit-testing,moq,return-value,C#,Entity Framework,Unit Testing,Moq,Return Value,我有一个带有实体框架的数据库,使用存储库设计模式。我的存储库中有一个方法,它获取两个输入,一个实体和一个IQuerable集合。方法算法应该根据实体输入从集合中返回另一个实体(为了简单起见,想象一个约会应用程序,其中userA根据userA的首选项获得userB作为推荐) 我有一个测试类库,用于使用nUnit和MOQ测试存储库。我正确地设置了mock,以返回假用户列表。然后我测试了这个方法 这是一个转折点。单元测试失败,因为存储库方法返回null。但是,如果我将算法复制并粘贴到单元测试中,它将返

我有一个带有实体框架的数据库,使用存储库设计模式。我的存储库中有一个方法,它获取两个输入,一个实体和一个
IQuerable
集合。方法算法应该根据实体输入从集合中返回另一个实体(为了简单起见,想象一个约会应用程序,其中userA根据userA的首选项获得userB作为推荐)

我有一个测试类库,用于使用nUnit和MOQ测试存储库。我正确地设置了mock,以返回假用户列表。然后我测试了这个方法

这是一个转折点。单元测试失败,因为存储库方法返回null。但是,如果我将算法复制并粘贴到单元测试中,它将返回正确的数据。发生了什么?这怎么可能?在下面的代码中,我对正确和错误的东西进行了注释

存储库方法:

public IUser SearchForDate(IUser entity, IQueryable<USERS> users)
{
        var userPartner = users.Where(x => x.Interested == entity.Male)
            .Where(x => x.MinAge < entity.Age)
            .Where(x => x.MaxAge > entity.Age)
            .Where(x => x.WantToDate == true).FirstOrDefault();

        return userPartner;
}
单元测试时:

[TestCase("Andrew", "Angela")]
public void SearchForPartner_ReturnsTheCorrectPartner(string userName, string partnerName)
{
        //Assert - Act
        var users = Repo.GetAll();
        var userNeedsPartner = users.Single(x => x.Nickname == userName); //this return the correct user - Andrew
        var partner = Repo.SearchForDate(userNeedsPartner, Repo.GetAll()); //NOT GOOD, WHY????Even if I use users instead of Repo.GetAll() - this mothafucka returns null.

        var partnerForUser = Repo.GetAll().Where(x => x.Interested == userNeedsPartner.Male)
           .Where(x => x.MinAge < userNeedsPartner.Age)
           .Where(x => x.MaxAge > userNeedsPartner.Age)
           .Where(x => x.WantToDate == true).FirstOrDefault(); //GOOD, WHY??? - This returns the correct user - Angela

        //Arrange
        Assert.That(partner.Nickname, Is.EqualTo(partnerName)); //NULLReferenceException...
}
[TestCase(“安德鲁”、“安吉拉”)]
public void SearchForPartner\u返回正确的合作伙伴(字符串用户名、字符串合作伙伴名称)
{
//断言-行为
var users=Repo.GetAll();
var userNeedsPartner=users.Single(x=>x.Nickname==userName);//返回正确的用户-Andrew
var partner=Repo.SearchForDate(userNeedsPartner,Repo.GetAll());//不太好,为什么???即使我使用users而不是Repo.GetAll()-这个mothafucka返回null。
var partnerForUser=Repo.GetAll()。其中(x=>x.interest==userNeedsPartner.Male)
.Where(x=>x.MinAgex.MaxAge>userNeedsPartner.Age)
.Where(x=>x.WantToDate==true).FirstOrDefault();//很好,为什么?-返回正确的用户Angela
//安排
Assert.That(partner.昵称,Is.EqualTo(partnerName));//NULLReferenceException。。。
}

好吧,我终于想出了解决办法。正如我声明我的Mock为
private Mock userRepo=new Mock()IUserRepository Repo=userRepo.Object所以当我调用
Repo.SearchForDate(IUser实体,iquirable用户)时IUserRepository
更改为
UserRepository
,然后boom。。。突然,一切都开始起作用了。无论如何,谢谢你们帮我的忙!:)

你能澄清一下你到底在测试什么吗
Repo.SearchForDate
是您未设置的模拟对象的方法。。。你希望在这条线上发生什么?(注意,如果你不理解在某些代码中发生了什么,最好每行有一个语句,包括第一个计算的所有参数…和良好的命名,如<代码> McKeDePoP<代码>,而不是<代码> RePO <代码>将极大地帮助)如果你认为它是MuthaFuCa在你的COMMET中的话,你的代码将不起作用。这就是我停止阅读的原因。什么是
Repo.GetAll()
?你认为你是在嘲笑
GetAllUsers()
,但是使用
GetAll()
对不起,
GetAll()
也在
setup()
方法中设置。我还没有包括在内。我更新了问题。
[TestCase("Andrew", "Angela")]
public void SearchForPartner_ReturnsTheCorrectPartner(string userName, string partnerName)
{
        //Assert - Act
        var users = Repo.GetAll();
        var userNeedsPartner = users.Single(x => x.Nickname == userName); //this return the correct user - Andrew
        var partner = Repo.SearchForDate(userNeedsPartner, Repo.GetAll()); //NOT GOOD, WHY????Even if I use users instead of Repo.GetAll() - this mothafucka returns null.

        var partnerForUser = Repo.GetAll().Where(x => x.Interested == userNeedsPartner.Male)
           .Where(x => x.MinAge < userNeedsPartner.Age)
           .Where(x => x.MaxAge > userNeedsPartner.Age)
           .Where(x => x.WantToDate == true).FirstOrDefault(); //GOOD, WHY??? - This returns the correct user - Angela

        //Arrange
        Assert.That(partner.Nickname, Is.EqualTo(partnerName)); //NULLReferenceException...
}