使用Moq实体框架进行.NET Web API单元测试

时间:2014-06-17 17:20:30

标签: c# entity-framework unit-testing asp.net-web-api

我对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中运行逻辑,我在这里真正验证了什么?这似乎是一种减轻我在本地托管服务的好方法。除此之外,我不确定这是多么有用。

1 个答案:

答案 0 :(得分:2)

您需要确定您的受测试单元(uut)是什么。如果它是一个控制器,那么存储库并不重要。单元测试应始终测试单个单元和该单元的单个功能。另一个要点是,一旦您开始托管服务,您就不再进行单元测试 - 它将成为集成测试。集成测试更难编写和维护。

提出问题

  

在我看来,这并没有运用myRepository代码。这是正确还是不正确?

正确。它不应该运用它,因为你的uut是控制器,因此你模拟/存根/伪造其他所有东西。

  

如果我没有在myRepository中运行逻辑,我在这里真正验证了什么?

您可以验证控制器是否具有正确的状态或行为,例如输入验证或控制器调用给定存储库的正确方法。