我想问你写单元测试的实践,如何模拟对象而不重复代码?
我正在使用 Symfony2 框架,例如我有许多带有自定义验证器的捆绑包。当我和我的团队的其他成员编写单元测试时,我们重复模拟 Constraint、ExecutionContext、ConstraintViolationBuilderInterface 的代码。我知道我们可以创建特征或抽象类或其他东西,我们可以在其中存储负责模拟的代码,但在我开始这样做之前,我想了解您的最佳实践。
我的第一个想法是创建一个类/特征,它将存储例如所有存储库的模拟。例子:
class MockRepositoryHelper extends \PHPUnit_Framework_TestCase
{
public function getUserRepositoryMock()
{
return $this->prophesize(UserRepository::class);
}
// next repositories getters
}
然后在实际测试用例中使用此代码:
class EmailValidator extends \PHPUnit_Framework_TestCase
{
private $mockRepositoryHelper;
public function setUp()
{
parent::setUp();
$this->mockRepositoryHelper = new MockRepositoryHelper();
}
/**
* @test
*/
public function it_should_find_user()
{
$userRepository = $this->mockRepositoryHelper->getUserReposioryMock();
$userRepository->findUser(Argument::type('string'))->willReturn(null);
// rest of the test
}
}
当然这只是我想象的伪代码,我的第一个想法。你有什么想法?
基本上我在问如何更快地编写单元测试并且不重复代码?