Behat + Laravel。方案失败,因为重定向似乎没有发生

时间:2015-01-29 00:00:40

标签: php laravel behat laravel-5

我正在尝试使用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

0 个答案:

没有答案