Предположим требуется написать функциональный тест по следующему сценарию:
- генерируем рендомное значение
- отправляем GET|POST запрос приложению для изменения этого значения скажем в БД
- выбираем значение напрямую из бд и смотрим что оно действительно изменилось
$color = strtoupper(dechex(rand(16,255)).dechex(rand(16,255)).dechex(rand(16,255)));
$I->sendPOST('/color', array('color'=>$color));
\PHPUnit_Framework_Assert::assertEquals($color, DB::GetColor());
Лобовой тест этого сценария вида выше работать не будет, по простой причине - codeception тесты это на самом деле "сценарии" которые выполняются в два приема - сначала код генерирует сценарий после он выполняется. Не сразу очевидно, но если подумать тут вы будете проверять генерирование значение с значением в БД на момент формирования сценария а не его выполнения.
Простейший хак с помощью хелпера и калбеков:
1. Добавляем в хелпер метод вида:
function assertEqualsCallback($expected, $callback, $message = '')
{
$actual = call_user_func_array($callback, array());
return parent::assertEquals($expected, $actual, $message);
}
2. Перегенериваем codeception
3. Наш TestGuy приобретает магию сравнения значения с калбеком
4. Рабочий тест получается таким
$color = strtoupper(dechex(rand(16,255)).dechex(rand(16,255)).dechex(rand(16,255)));
$I->sendPOST('/color', array('color'=>$color));
$I->assertEqualsCallback($color, function() {
return DB::GetColor();
});
5. PROFIT
PS. Код условен