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

我正在尝试使用Moq模拟向存储库添加元素,然后检查已插入的元素数量,但它总是给我0个元素,我的代码中有些错误,您能帮助我吗

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方法,以便接收存储库中的所有元素