Я пытаюсь провести модульное тестирование приложения ZF2. У меня есть форма, которая немного меняется в зависимости от того, предназначена ли она для студентов или сотрудников, и у меня есть две отдельные фабрики для их производства.
Во всяком случае, я попытался проверить форму студента в следующем тесте:
public function testStudentFormAcceptsValidValues()
{
$this->getEmMock();
$this->mockLogin('admin');
$form = $this->serviceManager->get('student_form');
$this->getApplicationServiceLocator()->setService('student_form', $form);
$url = '/user/account/add/student';
$this->dispatch($url);
$csrf = $form->get('csrf')->getValue();
$postData = $this->userStubData[1];
$postData['csrf'] = $csrf;
$user = new UserEntity();
$this->getApplicationServiceLocator()->setService('user_entity', $user);
$this->dispatch($url, 'POST', $postData);
$this->assertRedirectTo('/user#students');
$this->assertEntityPropertiesSet($user, $postData);
}
Когда я запускаю этот тест, он проходит. Тем не менее, я проводил аналогичный тест для формы сотрудника, но он не прошел, потому что токен CSRF был неверным. Так что просто ради удовольствия я решил провести вышеописанный тест два раза подряд, чтобы посмотреть, что произойдет. Это снова не удалось, и по той же причине.
Наконец, я решил проверить значения токенов CSRF для двух тестов и обнаружил, что они оба одинаковы. По какой-то причине форма повторно использовала значение CSRF из предыдущего теста вместо создания нового, и в результате форма отклоняла его.
Что мне нужно сделать, чтобы очистить старое значение CSRF и получить новое, которое примет форма?
Я не знаю точно, как вы настроили тестирование, но это загрузите приложение между тестами, чтобы вы запустили второй тест со всеми службами и т. д.
Возможно, некоторые из ваших служб инициализируются в первом тесте, а во втором тесте повторно используется уже инициализированный сервис с «неправильными» старыми значениями из первого теста.
Других решений пока нет …