我们有一些使用facade的类的旧版laravel项目。
我们最近的项目使用依赖注入来代替facade所表示的基础laravel类,正如Taylor Otwell本人所暗示的。 (我们对于每个类使用构造函数注入,但为了简化示例,这里我使用了方法注入并使用了一个单一的类。)
这对于单元测试非常有效。我试图理解的问题是,如果这些外观被“全局”模拟了。
例如,假设我正在编写一个集成测试(测试一些相互关联的类,同时模拟服务 - 不是使用实时服务的端到端测试),在某个时刻执行两个不同的类,这两个类包含调用相同方法且参数相同的相同外观。在这些类被调用之间,会执行一些复杂的功能,使用相同的参数更改由该外观方法返回的数据。
我们现代化的类很容易进行测试,因为外观所代表的基础类被注入到每个类中(在这个例子中是每个方法)。这意味着我可以创建两个不同的模拟对象并将它们注入到每个类(方法)中以模拟不同的结果。
在传统系统中,似乎模拟的外观是“全局”的,因此当在每个类中运行外观时,返回的确切值相同。
我想知道我的想法是否正确?
*我理解这个例子从代码架构和测试角度看似乎完全多余,但我剥离了所有真实功能,试图给出一些所问问题的“简单”示例。
use Cache;
LegacyClass
{
public function cacheFunctionOne()
{
$result = Cache::someFunction('parameter');
// logic to manipulate result
return $result;
}
public function cacheFunctionTwo()
{
$result = Cache::someFunction('parameter');
// different logic to manipulate result
return $result;
}
}
我们最近的项目使用依赖注入来代替facade所表示的基础laravel类,正如Taylor Otwell本人所暗示的。 (我们对于每个类使用构造函数注入,但为了简化示例,这里我使用了方法注入并使用了一个单一的类。)
use Illuminate\Cache\Repository as Cache;
ModernClass
{
public function cacheFunctionOne(Cache $cache)
{
$result = $cache->someFunction('parameter');
// logic to manipulate result
return $result;
}
public function cacheFunctionTwo(Cache $cache)
{
$result = $cache->someFunction('parameter');
// different logic to manipulate result
return $result;
}
}
我知道 门面可以被模拟
public function testExample()
{
Cache::shouldReceive('get')
->once()
->with('key')
->andReturn('value');
$this->visit('/users')->see('value');
}
这对于单元测试非常有效。我试图理解的问题是,如果这些外观被“全局”模拟了。
例如,假设我正在编写一个集成测试(测试一些相互关联的类,同时模拟服务 - 不是使用实时服务的端到端测试),在某个时刻执行两个不同的类,这两个类包含调用相同方法且参数相同的相同外观。在这些类被调用之间,会执行一些复杂的功能,使用相同的参数更改由该外观方法返回的数据。
$modernClass->cacheFunctionOne($cache); // easily mocked
// logic that changes data returned by laravel Cache object function 'someFunction'
$modernClass->cacheFunctionTwo($cache); // easily mocked with a different mock
我们现代化的类很容易进行测试,因为外观所代表的基础类被注入到每个类中(在这个例子中是每个方法)。这意味着我可以创建两个不同的模拟对象并将它们注入到每个类(方法)中以模拟不同的结果。
$legacyClass->cacheFunctionOne();
// logic that changes data returned by laravel Cache object function 'someFunction'
$legacyClass->cacheFunctionTwo();
在传统系统中,似乎模拟的外观是“全局”的,因此当在每个类中运行外观时,返回的确切值相同。
我想知道我的想法是否正确?
*我理解这个例子从代码架构和测试角度看似乎完全多余,但我剥离了所有真实功能,试图给出一些所问问题的“简单”示例。