【问题标题】:How to mock not implemented Dependency injection?如何模拟未实现的依赖注入?
【发布时间】:2013-06-10 08:32:09
【问题描述】:

我想对以下代码进行单元测试。现在我正在将 NUnit 与 Rhino Mock 一起使用。

注意:所有的 NUnit 测试用例都不应该做任何数据库操作

 interface IdbOperation  
 {
      int  insert();
 }

 public class databaseactivity:IdbOperation 
 { 
    public databaseactivity()
    {
      verifyDBConnection(); 
    }

    void verifyDBConnection() 
    { 
      DbManager dbManager=new  DbManager();

      if(dbManager.state()!=True)   
      {
        Throw new DatabaseException();
      }
    }

    public int insert(bo obj)   
    {   
      Serviceclient  serviceClient=new  Serviceclient(); 
      serviceClient.insert(obj);
    }
 }

在上面的代码中,我想为插入方法编写一个单元测试用例。我尝试了很多方法但无法模拟。所以请任何人帮助我模拟插入方法。尽快

您也可以向我推荐任何其他模拟框架。

【问题讨论】:

  • 在没有依赖注入的情况下,使用 mock 进行单元测试是行不通的。这就是生活。
  • 这一千倍。您需要重构代码,以免这些具体类在方法中被实例化。无法足够快地 +1 @sq33G 评论。
  • 谢谢我同意您的担忧,我与客户讨论过,但他们还没有准备好更改现有代码..这就是为什么我来这里寻找任何替代路线.. microsoft moles 会帮助吗?
  • 你想用那个方法测试什么。调用 ServiceClient 中的插入并接收 bo obj 作为参数?

标签: c# unit-testing nunit rhino-mocks


【解决方案1】:

这个呢?

public databaseactivity(IDbManager dbManager = null)
{
  DbManager dbManager = dbManager ?? new DbManager();
  // ...
}

如果您需要重新创建实例(就像ServiceclientFactory 的情况一样),您需要注入一个工厂(我会尽量避免这种情况,因为它会使事情变得更复杂):

public databaseactivity(ServiceclientFactory serviceClientFactory = null, /*...*/)
{
  // ...
  this.serviceClientFactory = serviceClientFactory ?? new DefaultServiceClientFactory();
}

public int insert(bo obj)   
{   
  serviceClient = this.serviceClientFactory.CreateServiceClient(); 
  serviceClient.insert(obj);
}

【讨论】:

  • 我想知道在代码无法更改时如何从单元测试中受益。当您无法修复现有错误时,为什么还要关心它们?当您无法更改代码时,您甚至无法再破坏任何东西。
  • 可以在不实现 DI 的情况下,microsoft moles 模拟上面的代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多