用于模拟的构造函数重载错误

时间:2012-02-08 17:44:13

标签: c# unit-testing mocking

我有3个程序集Presenter,Business和DataAccess。演示者引用引用DataAccess的业务和业务。

我在Business Assembly中有一个CustomerBusiness类,有2个单参数构造函数。第一个构造函数仅用于测试以模拟数据访问对象。 DataAccess程序集中的ICustomerDataAccess。

    class CustomerBusiness()
    {
      private ICustomerDataAccess _data= null;

      public CustomerBusiness(ICustomerDataAccess data)
      {
        _data = data;
      }

      public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
      {}

      public void SomeOtherMethods()
      {
        ...
      }
    }

在CustomerPresenter类中,我编写了下面的代码,该代码给出了在Presenter中不引用DataAccess程序集的错误。但我不想在Presenter中添加对DataAccess的引用。

var custBusiness = new CustomerBusiness(“english”)

有人可以推荐实现此目的的最佳方法,避免在Presenter中引用DataAccess吗?

仅当存在两个单个参数构造函数时才会发生错误。 当我有下面的构造函数时,错误就会出现:

      public CustomerBusiness(ICustomerDataAccess data, string language)
      {
        _data = data;
      }

       public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
  {}

2 个答案:

答案 0 :(得分:2)

我建议您将接口定义移动到合同程序集中,并使用IOC容器(例如Unity)在运行时注入实现,但有很多可供选择。

这将打破'implementation'程序集之间的编译时依赖性,并且无需创建单独的构造函数来传递模拟。

E.G。

Presentation  refs  >>  IBusiness(Consumes)
Business      refs  >>  IBusiness(Implements), IDataAccess(Consumes)
IDataAccess   refs  >>  IDataAccess(Implements)

答案 1 :(得分:2)

  

任何人都可以推荐实现此目的的最佳方法,避免   在Presenter中引用DataAccess?

我建议使用IoC容器或将依赖项一直冒泡到应用程序根目录...

你是对的 - 你的演示者不应该知道你的数据访问类。但是,如果您遇到问题,那么让您的“CustomerBusiness”了解并负责实例化数据访问类。你用于测试的第一个构造函数很棒 - 它只是你应该拥有的

然后,您应该让Presenter类在其构造函数中使用“CustomerBusiness”对象。然后,它可以使用CustomerBusiness而不知道如何实例化它或如何实例化数据访问对象,甚至是数据访问对象的存在。