Я пытаюсь освоить использование Behat и Laravel 5. У меня есть простой сценарий, который включает в себя создание сообщения:
Scenario: Post Creation
Given I have an account "john" "john@example.com"When I create a post "Example Post" "Example Content"Then I should see a post "Example Post"
В контексте контекста я определил «создание» и «просмотр» сообщения следующим образом:
/**
* @When I create a post :title :content
* @param $title string
* @param $content string
*/
public function iCreateAPost($title, $content)
{
$this->visit('admin/posts/create');
$this->fillField('title', $title);
$this->fillField('slug', \Str::slug($title));
$this->fillField('content', $content);
$this->pressButton('Create Post');
$this->printCurrentUrl();
}
/**
* @Then I should see a post :title
* @param $title
*/
public function iShouldSeeAPost($title)
{
$this->visit('admin/posts');
$this->printCurrentUrl();
$this->assertPageContainsText($title);
}
Если я сам выполняю эти шаги через браузер, все работает нормально. Однако мой iShouldSeeAPost
тест не пройден
После дальнейшей проверки admin/posts
страница посещена, но не содержит недавно добавленного сообщения. Я работал задом наперед и обнаружил, что в конце iCreateAPost
Метод текущий URL является тот, который соответствует store
метод моего контроллера, когда на самом деле контроллер перенаправляет на admin/posts/edit
стр. Так что, должно быть, что-то не так сразу после pressButton('Create Post')
действие.
Как я могу отладить это? Кажется, я не могу найти лучшего способа просмотра потока запросов и ответов, кроме printLastResponse
который не очень полезен. Я не думаю, что это проблема проверки, и мои другие тесты функций предполагают, что это не проблема базы данных.
Для справки вот тестовый вывод:
Scenario: Post Creation # features/posts.feature:6
Given I have an account "john" "john@example.com" # FeatureContext::iHaveAnAccount()
When I create a post "Example Post" "Example Content" # FeatureContext::iCreateAPost()
│ http://localhost/admin/posts/store
Then I should see a post "Example Post" # FeatureContext::iShouldSeeAPost()
│ http://localhost/admin/posts
The text "Example Post" was not found anywhere in the text of the current page. (Behat\Mink\Exception\ResponseTextException)
--- Failed scenarios:
features/posts.feature:6
1 scenario (1 failed)
3 steps (2 passed, 1 failed)
Обновить
Все еще не повезло с этим. Это тестирование самой основной задачи CRUD, и я не могу понять это.
Вот метод хранения на контроллере. Я использую инъекцию зависимостей Laravel для проверки запроса и хранения сообщения.
public function store(Post $post, CreatePostRequest $request)
{
$post = $post->create($request->all());
return redirect()->route('admin.posts.edit', [$post->id])
->with(['alert' => 'Post saved', 'alert-class' => 'success']);
}
Когда я использую $this->printLastResponse();
в моем тесте я, кажется, получаю очень мало вывода, обычно только URL. Кажется, метод store на контроллере не работает как
iShouldSeeAPost()
действительно выводит html страницы индекса, но запись не была сохранена.
Как я уже сказал, если я провожу тест вручную, он будет работать как положено.
соответствующие файлы:
https://github.com/harrygr/Creuset/blob/master/features/bootstrap/FeatureContext.php
https://github.com/harrygr/Creuset/blob/master/app/Http/Controllers/Admin/PostsController.php
https://github.com/harrygr/Creuset/blob/master/app/Http/Requests/CreatePostRequest.php
Задача ещё не решена.
Других решений пока нет …