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

Is this the correct way to Unit test the repository using mocks?

我有这个UserRepositoryclass。

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
    }
 }

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

您将使用模拟的 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
   }

   ....

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