gpt4 book ai didi

oop - 没有依赖注入(inject)的对象组合是一件坏事吗?

转载 作者:行者123 更新时间:2023-12-04 22:07:20 25 4
gpt4 key购买 nike

当对与另一个对象具有组合关系(“has-a”关系)的对象进行单元测试时,据我所知,如果您使用某种依赖注入(inject),您只能真正模拟组合对象。因此,以下类型的代码使单元测试变得非常困难,因此可能被认为是一件坏事:

<?php
class aSampleClass {
private $dependency;
public function __construct() {
$this->dependency = new otherClass;
}
}

通过将 otherClass 对象的实例作为参数传递给构造函数,这个玩具示例很容易转换为使用依赖注入(inject),但情况并非总是如此。上述形式的对象组合(在类实现中直接使用“new”运算符)是一件坏事吗?您是否应该始终尝试编写一个类,以便在隔离其关联的情况下对其进行全面测试?

当您使用简单的值对象(用领域驱动设计的说法)(如日期或金钱对象)时,使用依赖注入(inject)对我来说似乎搁浅了。在这些情况下,直接实例化相关的 Value 对象似乎才有意义。例如:

<?php
class anotherSampleClass {
public function getTimeDifferencePhrase() {
$now = new date_Time;
$then = new date_Time(time()-60*60*24);
return $now->relativeTimePhrase($then);
}
}

当然,在这个例子中,anotherSampleClass 的单元测试也执行 date_Time 对象的实现比尝试使用模拟对象或测试 double 。

想法?

最佳答案

这取决于您正在测试的。依赖注入(inject)解决了测试你的类的问题,而不必担心它对外部服务的依赖(它可能会失败,没有测试数据,或者不适合单元测试)。

您不会模拟一个值对象(或字符串、整数等)只是为了测试您的类是否正确构造了它并调用了差异运算符……这都是实现的一部分,并不真正相关对其进行测试。

但是,您可以测试 getRelativeTimeDifferencePhrase 在经过 60 * 60 * 24 秒 时是否正确返回“24 小时前”。

然后您将意识到您的硬编码 time() 会导致脆弱的测试 - 因为您无法足够准确地预测什么时候 time() 将返回什么你的代码运行。这将导致一个 RealTimeService,它将引入一个您可以控制的接缝。

让你的类实例化一个 RealTimeService 会让你无法注入(inject)你的 MockTimeService - 这样你就可以硬编码什么 time()是的,因此您最终会将 ITimeService 传递给您的构造函数。现在,你有了依赖注入(inject)。 ;)

关于oop - 没有依赖注入(inject)的对象组合是一件坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com