我正在尝试使用Moq模拟向存储库添加元素,然后检查已插入的元素数量,但它总是给我0个元素,我的代码中有问题,你能帮我吗? / p>
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);
在candidateBL中我检查了存储库变量并且有0个元素。
谢谢。
答案 0 :(得分:2)
在没有看到更多代码的情况下,我相当自信你已陷入陷阱,认为某个界面的模拟在某种程度上具有与你的接口实现相关的逻辑。
换句话说,您认为此代码实际上会将candidate
插入到您的存储库中:
repo.Setup(x => x.Insert(candidate));
repo.Setup(x => x.Submit());
如果这是您的理解,根本不是。上面的代码告诉您的模拟期望使用指定的Insert
实例调用Candidate
,并期望调用Submit
。模拟对象的方法有无实现;他们完全按照Setup
方法告诉他们做的事情。
而不是将模拟视为实际实现,您需要告诉它如何在被测试的代码使用时响应。例如,让我们说你的candidateBL.Get
方法就像这样简单:
public Candidate Get(Guid id)
{
try
{
return _repository.Find(id);
}
catch (KeyNotFoundException)
{
return null;
}
}
现在假设你正在测试这种方法。在简单的情况下,这里有两个测试用例:一个在存储库中找到一个Candidate
并返回,另一个在id
不存在的情况下存储库抛出的情况。您需要设置模拟以在每个测试中反映这些情况。
第一个测试将按如下方式设置存储库mock:
var repo = new Mock<ICandidateRepository<Candidate>>();
repo.Setup(x => x.Find(candidate.Id)).Returns(candidate));
请注意,我没有在哪里插入候选人;当我使用特定标识符调用Find
时,我告诉模拟器将它返回给我。
为了完整性,第二次测试会将其设置为抛出:
var repo = new Mock<ICandidateRepository<Candidate>>();
repo.Setup(x => x.Find(candidate.Id)).Throws(new KeyNotFoundException()));