Предположим требуется написать функциональный тест по следующему сценарию:

  1. генерируем рендомное значение
  2. отправляем GET|POST запрос приложению для изменения этого значения скажем в БД
  3. выбираем значение напрямую из бд и смотрим что оно действительно изменилось
$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. Код условен