尤川豪   ·  3月前
317 貼文  ·  221 留言

Laravel 測試環境 DatabaseTransactions Trait 沒有作用?

找這 bug 找了很久 最後終於發現

因為我不只是寫 unit test,還有寫 application test

        $response = $this->get('/');

        $response->assertStatus(200);

這種發 request 的動作 後面對應的是

// Illuminate\Foundation\Testing\Concerns\MakesHttpRequests

    public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
    {
        $kernel = $this->app->make(HttpKernel::class);

        $files = array_merge($files, $this->extractFilesFromDataArray($parameters));

        $symfonyRequest = SymfonyRequest::create(
            $this->prepareUrlForRequest($uri), $method, $parameters,
            $cookies, $files, array_replace($this->serverVariables, $server), $content
        );

        $response = $kernel->handle(
            $request = Request::createFromBase($symfonyRequest)
        );

        $kernel->terminate($request, $response);

        return $this->createTestResponse($response);
    }

因為不在測試程式的 transaction 裡面了 所以不起作用

雖然有點不懂 但需要去看 HttpKernel 以及 SymfonyRequest 的實作才可以

  分享   共 181 次點閱
按了喜歡:
共有 1 則留言
尤川豪   ·  3月前
317 貼文  ·  221 留言

最後我只好這樣做

    public function tearDown()
    {
        $tableNames = \DB::getDoctrineSchemaManager()->listTableNames();

        \Schema::disableForeignKeyConstraints();

        foreach ($tableNames as $name) {
            //if you don't want to truncate migrations
            if ($name == 'migrations') {
                continue;
            }

            \DB::table($name)->truncate();
        }

        parent::tearDown();
    }
 
您的留言
尤川豪
317 貼文  ·  221 留言

Devs.tw 是讓工程師寫筆記、網誌的平台。隨手紀錄、寫作,方便日後搜尋!

歡迎您一起加入寫作與分享的行列!

查看所有文章