我对Moq实体框架或web api测试不是很熟悉。 说Moq框架不运用控制器逻辑是否正确?在我看来,moq允许您将实体设置为预期的结果和参数。然后,您可以简单地验证是否调用了正确的方法。
例子。 假设我有一个apicontroller,它包含一个签名为:
的方法public int GetEntity(string id)
{
return myRepository.Get(id);
}
然后让界面看起来像这样:
public Interface IRepository
{
public int Get(int id);
}
所述界面的实现如下:
public class myRepository : IRepository
{
public int Get(int id)
{
if(id == null)
{
throw some exception();
}
// more logic here
// maybe I fetch some data from a data source
}
}
因此moq框架允许我创建我的存储库的实例。
Mock<IRepository> mockRepo = new Mock<IRepository>();
// some setup
this.mockRepo.Setup(repo => repo.Get(It.IsAny<int>()).Returns(new int { TotalResults = 1});
// then an assert to ensure I got the expected number of results.
在我看来,这并没有运用myRepository代码。这是正确还是不正确?如果我没有在myRepository中运行逻辑,我在这里真正验证了什么?这似乎是一种减轻我在本地托管服务的好方法。除此之外,我不确定这是多么有用。
答案 0 :(得分:2)
您需要确定您的受测试单元(uut)是什么。如果它是一个控制器,那么存储库并不重要。单元测试应始终测试单个单元和该单元的单个功能。另一个要点是,一旦您开始托管服务,您就不再进行单元测试 - 它将成为集成测试。集成测试更难编写和维护。
提出问题
在我看来,这并没有运用myRepository代码。这是正确还是不正确?
正确。它不应该运用它,因为你的uut是控制器,因此你模拟/存根/伪造其他所有东西。
如果我没有在myRepository中运行逻辑,我在这里真正验证了什么?
您可以验证控制器是否具有正确的状态或行为,例如输入验证或控制器调用给定存储库的正确方法。