我正在编写一个简单的测试来创建一个元素,看看它是否存在然后删除它以在每次构建时验证我的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模仿这个,还有另一种方法可以删除吗?
答案 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/