Создание фиктивных классов обычно включает в себя настройку ожиданий вызова метода для двойников mocks/test.
Например. в «ванильном» PHPUnit мы можем заглушить вызов метода и установить ожидания следующим образом:
$stub->expects($this->any())->method('doSomething')->willReturn('foo');
В структуре фиктивных объектов Mockery мы получаем такой API:
$mock->shouldReceive('doIt')->with(m::anyOf('this','that'))->andReturn($this->getSomething());
Подобные ожидания часто закладываются на этапе настройки набора тестов, например. setUp()
метод \PHPUnit_Framework_TestCase
.
Ожидания, подобные представленным выше, не выдержат испытания, если они не оправдаются. Следовательно, делая ожидания реальными утверждениями.
Это приводит к ситуации, когда у нас есть утверждения (утверждения + ожидания), разбросанные по классу тестового примера, поскольку в конечном итоге мы получаем фактические утверждения на этапе настройки тестового примера, а также в отдельных тестах.
Будет ли хорошей практикой проверять ожидания вызова метода в «обычном» методе assert..
. Это может выглядеть так (насмешка):
public function setUp()
{
$mock = m::mock(SomeClass::class);
$mock->shouldReceive('setSomeValue');
$this->mock = $mock;
}
и позже в конце одного из тестовых методов:
public function testSoemthing()
{
...
$this->assertMethodCalled($this->mock, 'setSomeValue');
}
assertMethodCalled
не является методом, предоставляемым PHPUnit. Это должно быть реализовано.
Короче говоря, должны ли мы рассматривать объявления ожиданий как фактические утверждения и, следовательно, проверять их в наших методах тестирования?