У меня есть эта гвардия:
protected function validateRemove($key)
{
if (!isset($this->collection[$key])) {
throw new CategoryCollectionBadItemException();
}
}
И тест:
/**
* @test
* @expectedException InfluenceDecision\Domain\Exception\Category\CategoryCollectionBadItemException
*/
public function removeMethodMustThrowExceptionWithInvalidKey()
{
$this->categoryCollection->add(
new Category(
null,
'test category'
)
);
$this->categoryCollection->remove(1);
}
CategoryCollection удаляет вызов метода validateRemove
Тест работает нормально, но покрытие не на 100%, потому что тест не может получить доступ к последней строке метода validateRemove:
Какое лучшее решение?
Это происходит потому, что вы не тестируете обе ветви функции, в вашем тестовом случае функция прерывается, когда вы выкидываете исключение, поэтому она технически не завершается. Вы проверили half
функции, даже если это единственная логика там.
Если вы хотите 100% покрытие, вам нужно создать тест, где $this->collection[$key]
установлено .
В этом случае я бы предложил изменить вашу функцию на что-то вроде
protected function validateRemove($key)
{
if (!isset($this->collection[$key])) {
throw new CategoryCollectionBadItemException();
}
return true;
}
а затем создать еще один тест, который утверждает, что истина при вызове validateRemove()
а также $this->collection[$key]
установлено.
Мой пример — я не знаю, как вы используете этот кусок кода!
Других решений пока нет …