Moq Repository返回0项

时间:2017-06-27 16:17:44

标签: c# get repository moq

我正在尝试使用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个元素。

谢谢。

1 个答案:

答案 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()));