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用户)时方法,它一直返回null,因为Repo只是一个没有实际实现的接口。所以我决定将Mock的类型从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...
}