Чтобы ответить на ваши вопросы:
Это нормально, как я объединяю два первых теста?Утверждение возврата метода необходимо и имеет смысл в этом случае?Имеет ли смысл тестовая зависимость (testToString)?
Я бы не стал вводить зависимость между этими двумя случаями, поскольку это фактически два разных поведения.Первый метод - тестирование поведения метода make()
, который создает новые экземпляры, а второй - тестирование поведения приведения к строке.
Зависимые тесты должны быть скорее исключением, чем правилом.Используйте их, если нет другого способа, например, слишком дорого повторять вызовы в каждом тестовом методе (например, сетевые вызовы в интеграционных тестах и т. Д.).
А как насчет тестирования Get и Set в одном тесте?
На мой взгляд, все в порядке.Вы по-прежнему описываете то же поведение - как только родитель установлен, к нему можно получить доступ.
Мой главный совет - начать фокусироваться на освещении одного поведения для каждого метода теста, а не на одном методе.Обычно требуется один вызов метода, но не каждый раз.
Я бы обновил ваш тестовый пример на:
Попытайтесь назвать ваши методы тестирования лучше.Опишите поведение, которое вы ожидаете.Начните свои методы тестирования с testIt...
или testItShould...
Вместо того, чтобы сосредоточиться на добавлении метода тестирования для каждого производственного метода, сосредоточьтесь на описании поведения (testMake
против testMakeCreatesNewType
),Таким образом, вы можете иметь более одного метода тестирования, описывающего поведение одного метода производства.
Избегать @depends
.Вряд ли это когда-либо понадобится, и это хорошо только для интеграционных тестов, когда вам нужно сделать как можно меньше вызовов ввода / вывода.Модульные тесты должны быть независимыми.
Сосредоточиться на удобочитаемости каждого теста.В этом конкретном примере, я думаю, частная собственность не делает вещи более читабельными.
Используйте более конкретные утверждения для лучшей обратной связи.Использование более специализированных утверждений, таких как assertInstanceOf
, assertSame
и т. Д., Дает вам лучшее сообщение об ошибке, когда тест не пройден, и приводит к меньшей потребности в пользовательских сообщениях, а также делает более читабельными тесты.
Удалить бесполезно setUp()
.Вызывается только родитель, который только издает шум.
class TypeTest extends TestCase
{
public function testMakeCreatesNewType()
{
$type = Type::make('staff');
$this->assertInstanceOf(Type::class, $type);
}
public function testItCanBeCastToString()
{
$type = Type::make('staff');
$this->asserSame('staff', (string) $type);
}
public function testItExposesTheParent()
{
$type = Type::make('staff');
$parent = $this->createMock(Type::class);
$type->setParent($parent);
$this->assertSame($parent, $type->getParent());
}
public function testItReturnsNullIfParentWasNotSet()
{
$type = Type::make('staff');
$this->assertNull($type->getParent());
}
}
Это сделает более удобочитаемыми, поддерживаемыми и надежными тестами.