Это может показаться глупым, надеюсь, что нет, но я хочу создать службу, которая вернет макеты для людей, которые используют мой проект, чтобы они могли издеваться над всеми классами из моего проекта и проверить их код.
Моя идея заключалась в том, чтобы предложить такой сервис, чтобы его можно было вызывать в тестовых случаях другого проекта и получить соответствующий макет для каждого теста.
Это возможно? Или есть другие способы сделать это. Кстати, я не могу использовать какую-то насмешливую библиотеку из-за ограничений проекта.
Да, это возможно. Под капотом метод getMock
использует класс PHPUnit_Framework_MockObject_Generator
. Поэтому вы можете использовать его напрямую:
PHPUnit_Framework_MockObject_Generator::getMock($originalClassName, $methods)
Но вы потеряете все ярлыки ожидания, такие как $this->once()
. Вам нужно будет создавать собственные ожидания:
$mock->expects(\PHPUnit_Framework_TestCase::once())
Посмотрите исходный код PHPUnit, чтобы узнать, как строятся макеты
Если вы построите макет вне TestCase, он не будет учитываться как макет, и его ожидания не будут проверяться автоматически.
Если ваша служба mock builder должна использоваться исключительно из тестов PHPUnit (даже если эти тесты не связаны), вы можете передать экземпляр testcase в mock-конструктор, чтобы вы могли строить макет обычным способом:
class MockBuilderService { private $test; public function __construct(PHPUnit_Framework_TestCase $test) { $this->test = $test; } public function buildVeryComplexMock() { $mock = $this->test->getMock('MyClass'); $mock->expects($this->test->once()) ->method('foo') ->willReturn(1); return $mock; } }
Поэтому вы можете использовать его из своего теста:
class ATest extends PHPUnit_Framework_TestCase { public function testFoo() { $mock_builder = new MockBuilderService($this); $complex_mock = $mock_builder->buildVeryComplexMock($mock_configuration); // the mock expectations will be checked as usual } }