laravel 5异常Illuminate \ Session \ TokenMismatchException在单元测试中

时间:2015-02-13 12:23:08

标签: php unit-testing laravel laravel-5

我正在尝试编写一个测试,检查仅与注册用户完成的一些活动。所以我需要通过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

有人知道解决方法吗?

3 个答案:

答案 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()。