【问题标题】:Optional dependency injection for unit testing用于单元测试的可选依赖注入
【发布时间】:2011-01-21 20:37:58
【问题描述】:

我正在考虑设置单元测试类的选项。在正常情况下,这个特定的类应该总是使用相同的soap客户端配置。我觉得该课程的用户在使用肥皂客户端时不需要关心它的设置。或者,甚至要知道它完全使用肥皂。

真正唯一的例外是在单元测试中。我需要能够模拟 Soap_Client。我想出了以下方法,我在构造函数中创建了肥皂客户端,并且可以选择使用 setSoapClient() 进行设置。

class WebServiceLayer
{
    const WSDL_URL = 'https://www.example.com/?WSDL';

    private $soapClient;

    public function __construct()
    {
        $this->soapClient = new Soap_Client(self::WSDL_URL);
    }

    public function setSoapClient(Soap_Client $soapClient)
    {
        $this->soapClient = $soapClient;
    }

    public function fetchSomeResponse()
    {
        $soapClient = $this->soapClient;
        return $soapClient->someRequest();
    }
}

这是处理此问题的有效方法吗?我看到的唯一问题是,我在构造函数中实例化客户端,“我听说过”是要避免的。

我以前在其他课程上也遇到过这种困境,所以很高兴能得到人们对此的意见。

【问题讨论】:

  • 修改了示例,使客户端在构造函数中创建,而不是延迟加载。

标签: unit-testing dependency-injection


【解决方案1】:

对我来说看起来不错...您正在使用标准的 Setter 注入。唯一奇怪的是在 Getter 中返回了一个新客户端。没有注入为什么不返回null呢?

【讨论】:

  • 我让 getter 使用典型配置创建一个肥皂客户端。但是,现在我看它,我不妨在构造函数中创建它。它更简单。
  • 让 WebServiceLayer 实例化 SOAP 客户端有点违背依赖注入的目的......如果你真的想要松散耦合的代码,甚至你的默认值也应该被注入。
  • 是的,这是有道理的。我在想关于它是如何工作的知识不应该成为课堂用户的关注点。但我想这是一种权衡,你必须做出松散耦合。我认为这个问题解决了我的根本问题:stackoverflow.com/questions/1005473/…
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2017-04-01
  • 2021-05-29
  • 2018-03-03
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多