如果我理解正确,那么您正在搜索的是一个很好的创建库stubs 和mocks.
如果您使用PHPUnit,它有一个特性。看见https://phpunit.de/manual/current/en/test-doubles.html#test-doubles
例如,假设您有这样一个类:
namespace MyApp;
class MyCustomUser {
public function __construct(\\WP_User $user) {
$this->user = $user;
}
public function hasCapability($capability) {
return $this->user->can($capability);
}
}
您可以创建一个包含用户工厂的特征,并利用PHPUnit的模拟功能:
namespace MyApp\\Tests;
trait CreateUserTrait {
protected function createUser(array $capabilitites) {
$stub = $this->createMock(MyCustomUser::class);
$has_capability = function($capability) use ($capabilitites) {
return in_array($capability, $capabilitites, true);
};
$stub->method(\'hasCapability\')->will($this->returnCallback($has_capability));
}
}
此时,在测试类中,您可以使用该特性并利用工厂:
namespace MyApp\\Tests;
use PHPUnit\\Framework\\TestCase;
class UserMockTest extends TestCase
{
use CreateUserTrait;
public function testUserFactoryWorks()
{
$userMock = $this->createUser([\'create_post\']);
$this->assertTrue($userMock->hasCapability(\'create_post\'));
}
}
当然,当您需要测试其他使用模拟对象的对象时,模拟和存根很有用。你不会嘲笑SUT的。
使用mock的一个很好的副作用是,我们在测试中没有使用任何WordPress函数或类(即使原始用户对象使用WordPressWP_User
对象),因此测试可以在不加载WordPress的情况下运行,使其成为真正的单元测试:如果加载WordPress,它将成为集成测试,而不是单元测试。
许多人觉得PHP的模拟语法有点难以理解。如果你是其中之一,你可能想看看Mockery, 它有一个更简单的API。
根据您的需要,Faker 可能也会有很大帮助。
注:以上代码需要PHP 5.5,假设PHPUnit版本为5。*需要PHP 5.6+