Laravel 5.1 PhpUnit删除方法不起作用

时间:2015-11-09 21:44:04

标签: unit-testing phpunit laravel-5.1

我正在编写一个简单的测试来创建一个元素,看看它是否存在然后删除它以在每次构建时验证我的Web应用程序的完整性。

我有一个测试:

$this->visit('admin/menu/samples')
        ->seePageIs('admin/menu/samples')
        ->click('New Sample')
        ->seePageIs('admin/menu/samples/new/create')
        ->type('test1', 'name')
        ->type('test2','description')
        ->type('test2','introduction')
        ->select(1, 'scenario_id')
        ->type('test','slug')
        ->press('Add')
        ->seePageIs('admin/menu/samples')
        ->delete('admin/menu/samples/'. \App\Sample::whereSlug('test')->first()->id )
        ->visit('admin/menu/samples')
        ->dontSee('test1');

它创建了Sample元素,但由于我有几个Delete按钮(对于索引中的每个Sample元素,因为它们在列表中)我不能使用click / press('Delete')方法。所以我想我只是使用我已经设置的删除方法。问题是它不会删除我创建的元素。删除请求将不起作用。 我向你保证路线在那里,如果我按下删除按钮,我的Sample元素将被删除。

为什么我不能用PHPUnit模仿这个,还有另一种方法可以删除吗?

1 个答案:

答案 0 :(得分:0)

我刚才有同样的问题。原来是CSRF令牌问题。每当您执行“GET”请求以外的请求时,您将需要验证您的CSRF令牌。现在,当你在网站上时,Laravel做得很好,这就是为什么通过“按”提交表格将起作用:http://laravel.com/docs/5.1/routing#csrf-protection。在我的特定情况下,似乎我的令牌是通过XSRF-Token cookie生成的,可以通过简单检查请求标头来完成。

但是,如果您使用该网址,则需要手动生成CSRF令牌。要执行此操作,只需致电csrf_token()并将其注入您的通话中:

$this->visit('admin/menu/samples')
    ...
    ->delete('admin/menu/samples/'. \App\Sample::whereSlug('test')->first()->id,
                ['_token'=>csrf_token()],[] )
    ...;

以下是帮助我弄清楚如何注入令牌的文章,但不要混淆$ this-> call和$ this-> delete的方法签名: http://davejustdave.com/2015/02/08/laravel-5-unit-testing-with-csrf-protection/