mocking的构造函数重载出错

本文关键字:出错 重载 构造函数 mocking | 更新日期: 2023-09-27 18:23:43

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

我在Business程序集中有一个类CustomerBusiness,它有两个单参数构造函数。第一个构造函数仅用于模拟数据访问对象的测试。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=新客户业务("英语")

有人能推荐什么是实现这一点的最佳方法,避免在Presenter中引用DataAccess吗?

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

      public CustomerBusiness(ICustomerDataAccess data, string language)
      {
        _data = data;
      }
       public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
  {}

mocking的构造函数重载出错

有人能推荐什么是实现这一点的最佳方法吗在Presenter中引用DataAccess?

我建议要么使用IoC容器,要么将依赖项一直冒泡到应用程序根。。。

你是对的,你的演示者不应该知道你的数据访问类。但是,让您的"CustomerBusiness"了解并负责实例化数据访问类是有问题的。您用于测试的第一个构造函数非常棒——它是您应该拥有的唯一构造函数。

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

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

这将打破"implementation"程序集之间的编译时依赖关系,并消除创建单独构造函数以传递mock的需要。

例如

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