我正在尝试使用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
方法对应的url,而实际上控制器重定向到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任务,我似乎无法弄明白。
这是控制器上的store方法。我正在使用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();
时,我似乎得到的输出很少,通常只是网址。似乎控制器上的存储方法不起作用
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