我正在尝试编写一个测试,检查仅与注册用户完成的一些活动。所以我需要通过laravel 5身份验证过程(使用_token)
这是我的测试类
class ImportTest extends TestCase {
private $files = array();
/**
* Creates the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
private function beTheUser(){
$this->be(User::all()->first());
}
public function testAccessImportPageAjaxLoggedIn(){
$this->beTheUser();
$import = Import::all()->first();
if($import!=null){
$this->call('POST','ImportDocumentsController@status',array(
'import_id' => $import->id,
'_token' => Session::token()
));
$this->assertResponseStatus('404');
}
$this->assertTrue(TRUE);
}
}
当我尝试用phpunit测试来测试这个函数时,我得到了测试.ERROR:exception Illuminate\Session\TokenMismatchException
有人知道解决方法吗?
答案 0 :(得分:2)
正如@lukasgeiter发现的那样,一个可能的解决方案就是编写这一行
public function beTheUser {
Session::start();
$this->be(User::all()->first());
}
我还需要在文件的开头添加这一行。
use Session;
而不是
使用use Symfony\Component\HttpFoundation\Session\Session;
然后 在函数需要时......
$this->call('POST','/documents/import/'.$import->id,array(
'_token' => Session::get('_token')
));
//or
$this->call('POST','/documents/import/'.$import->id,array(
'_token' => Session::token()
));
答案 1 :(得分:1)
运行php artisan config:clear
。您的配置可能被缓存,导致测试环境实际上指向您的本地环境
相关的Laracasts线程:https://laracasts.com/discuss/channels/laravel/laravelphpunit-testing-tokenmismatchexception#reply=486865
答案 2 :(得分:0)
尝试使用csrf_token()而不是Session :: token()。