C# Moq存储库返回0个项目
我正在尝试使用Moq模拟向存储库添加元素,然后检查已插入的元素数量,但它总是给我0个元素,我的代码中有些错误,您能帮助我吗C# Moq存储库返回0个项目,c#,get,repository,moq,C#,Get,Repository,Moq,我正在尝试使用Moq模拟向存储库添加元素,然后检查已插入的元素数量,但它总是给我0个元素,我的代码中有些错误,您能帮助我吗 var candidate = new Candidate { Id = Guid.NewGuid()}; var repo = new Mock<ICandidateRepository<Candidate>>(); repo.Setup(x => x.Insert(candidate)); repo.Setup(x
var candidate = new Candidate { Id = Guid.NewGuid()};
var repo = new Mock<ICandidateRepository<Candidate>>();
repo.Setup(x => x.Insert(candidate));
repo.Setup(x => x.Submit());
candidateBL.setRepository(repo.Object);
MinifiedCount<MinifiedCandidate> result = candidateBL.Get(username, skip, take, id);
var-candidate=new-candidate{Id=Guid.NewGuid()};
var repo=new Mock();
回购设置(x=>x.Insert(候选));
repo.Setup(x=>x.Submit());
candidateBL.setRepository(repo.Object);
MinifiedCount结果=candidateBL.Get(用户名、跳过、获取、id);
在candidateBL中,我检查了repository变量,并且有0个元素
谢谢。在没有看到更多代码的情况下,我很有信心您已经落入了这样的陷阱,即认为接口的模拟在某种程度上具有与该接口的实现相关的逻辑 换句话说,您似乎认为此代码实际上会将
candidate
插入您的存储库:
repo.Setup(x => x.Insert(candidate));
repo.Setup(x => x.Submit());
如果这是你的理解,那就完全不是这样了。上面的代码告诉您的mock期望调用指定的候选者
实例的Insert
,还期望调用Submit
。模拟对象的方法没有实现;他们完全按照您在设置
方法中告诉他们的做
您需要告诉它在被测试代码使用时如何响应,而不是像对待实际实现一样对待模拟。例如,假设您的candidateBL.Get
方法很简单,如下所示:
public Candidate Get(Guid id)
{
try
{
return _repository.Find(id);
}
catch (KeyNotFoundException)
{
return null;
}
}
现在假设您正在测试此方法。在这个简单的例子中,这里有两个测试用例:一个是在存储库中找到一个候选者并返回,另一个是在id
不存在时存储库抛出。您需要设置模拟以在每个测试中反映这些情况
第一个测试将设置存储库模拟,如下所示:
var repo = new Mock<ICandidateRepository<Candidate>>();
repo.Setup(x => x.Find(candidate.Id)).Returns(candidate));
在没有看到更多代码的情况下,我确信您已经陷入了这样一个陷阱:认为接口的模拟在某种程度上具有与该接口的实现相关的逻辑
换句话说,您似乎认为此代码实际上会将candidate
插入您的存储库:
repo.Setup(x => x.Insert(candidate));
repo.Setup(x => x.Submit());
如果这是你的理解,那就完全不是这样了。上面的代码告诉您的mock期望调用指定的候选者
实例的Insert
,还期望调用Submit
。模拟对象的方法没有实现;他们完全按照您在设置
方法中告诉他们的做
您需要告诉它在被测试代码使用时如何响应,而不是像对待实际实现一样对待模拟。例如,假设您的candidateBL.Get
方法很简单,如下所示:
public Candidate Get(Guid id)
{
try
{
return _repository.Find(id);
}
catch (KeyNotFoundException)
{
return null;
}
}
现在假设您正在测试此方法。在这个简单的例子中,这里有两个测试用例:一个是在存储库中找到一个候选者并返回,另一个是在id
不存在时存储库抛出。您需要设置模拟以在每个测试中反映这些情况
第一个测试将设置存储库模拟,如下所示:
var repo = new Mock<ICandidateRepository<Candidate>>();
repo.Setup(x => x.Find(candidate.Id)).Returns(candidate));
什么是candidateBL
?你能分享candidateBL.Get
方法的代码吗?太长了,对解决问题没有帮助,我对设置存储库的行进行了注释,它给了我5个元素,但我想使用模拟存储库。。。非常感谢@chetanranpariya我希望您不要期望插入
和提交
调用将候选
放入某个存储库中……您如何创建候选
?候选
是否也必须创建为模拟?candidateBL是这样创建的:candidateBL=newCandidateBL();在测试设置中,什么是candidateBL
?你能分享candidateBL.Get
方法的代码吗?太长了,对解决问题没有帮助,我对设置存储库的行进行了注释,它给了我5个元素,但我想使用模拟存储库。。。非常感谢@chetanranpariya我希望您不要期望插入
和提交
调用将候选
放入某个存储库中……您如何创建候选
?候选
是否也必须创建为模拟?candidateBL是这样创建的:candidateBL=newCandidateBL();在TestSetupHi@PatrickQuirk上,我的Get方法非常庞大,它从一开始就进行选择,然后使用Where表达式(linq)过滤元素。我不能测试我的Get方法本身吗?嘿@PatrickQuirk我注意到进行此测试时假设存储库中已经存在该候选者.Id,对吗?我想做一个干净的存储库并在那里插入元素,然后使用所有可选参数测试Get方法,这样我就可以在repositoryHi@PatrickQuirk中接收所有元素。我的Get方法非常庞大,它在开始时进行选择,然后使用Where表达式(linq)过滤元素。我不能测试我的Get方法本身吗?嘿@PatrickQuirk我注意到进行此测试时假设存储库中已经存在该候选者.Id,对吗?我想做一个干净的存储库并在那里插入元素,然后使用所有可选参数测试Get方法,以便接收存储库中的所有元素