c# - 这是使用模拟对存储库进行单元测试的正确方法吗?

标签 c# .net unit-testing repository-pattern

我有这个 UserRepository 类。

public class UserRepo : IUserRepo 
{
    public TheUser RegisterUser(UserRegistrationDetails details)
    {
        //implementation here
    }

    public bool DeleteUser(string username)
    {
        //implementation here
    }

    public TheUser UpdateUser(TheUser user)
    {
        //implementation here
    }
 }

现在为了测试这个,我通过实现相同的接口(interface) IUserRepo 创建了一个模拟存储库,我的测试类现在调用这个模拟存储库。我觉得我在这里做错了什么,因为我没有测试实际的 UserRepository 类,而是测试了它的另一个模拟实现。我应该如何纠正这个问题?存储库是否经过测试?

最佳答案

您将使用模拟的 IUserRepo 来测试使用 IUserRepo 的类,而不是测试 UserRepo 的实现。

public class Consumer
{
  private IUserRepo repo;  

  public Consumer(IUserRepo repo)
  {
    this.repo = repo;
  }

  public void DoStuff()
  { 
    // Act upon repository
  }
}

您将能够使用您的 Mocked 存储库测试 Consumer,将其与任何(例如)数据库调用隔离。

要对 UserRepo 本身进行单元测试,您需要传入 依赖项

public class UserRepo : IUserRepo 
{
   private ISomeDependancy dependancy;

   public UserRepo(ISomeDependancy dependancy)
   {
      this.dependancy = dependancy;
   }

   public TheUser RegisterUser(UserRegistrationDetails details)
   {
       //implementation here, that consumes this.dependancy
   }

   ....

并应用与上述相同的理论。

关于c# - 这是使用模拟对存储库进行单元测试的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635784/

相关文章:

c# - T 必须是具有公共(public)无参数构造函数的非抽象类型,以便将其用作泛型类型或方法中的参数 'TModel'

c# - ASP.NET 5 - MVC 6 - 单元测试使用 Url.Action 的 Controller

java - Google Guava Predicates.or() 或 Predicates.and() 类型

.net - 调试断言与异常

c# - 今天,我如何接近 C# 中的不可空引用类型?

c# - 如何将列表绑定(bind)到dataGridView?

c++ - 单元测试和 boost::asio

c# - 返回新 Task<HttpResponseMessage> 的 IActionFilter 从不返回

c# - 将参数从 Silverlight 中的 xaml 传递给构造函数

c# - 使用 ISerializable 反序列化 .NET 字典