Laravel 5 PHPUnit 测试 - 将控制器中的所有测试包装到单个事务中

Laravel 5 PHPUnit Testing - Wrapping All Tests Within a Controller Into a Single Transaction

我的 Laravel 应用程序中有以下测试文件:

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ApiAuthControllerTest extends TestCase{

    use DatabaseTransactions;

    public function testLogin(){

        // Test login success
        $response = $this->json('POST', '/login', array(
            'email' => 'hello@yahoo.com',
            'password' => 'sometext'
        ))->decodeResponseJson();
        return $response['token'];

    }

   /**
     * @depends testLogin
     */
    public function testLogout($token){

        // Test logout success
        $this->json('DELETE', '/logout', array(
            'token' => $token
        ))->assertReponseStatus(200);

    }

}

我正在使用 DatabaseTransactions class 将我的测试包装为事务,这样它们就不会写入我的数据库。我注意到使用此 class 会将每个单独的测试作为事务包装在我的 class 中。

我想将整个 class 打包为一笔交易。在我上面的示例中,我需要从我的登录请求生成的令牌在我测试注销请求时持久保存在数据库中。

如何使用 Laravel 执行此操作?

不幸的是,我认为这是不可能的。 Laravel 在 setUp/tearDown 上刷新应用程序实例。在 PHPUnit 中,这些函数是 运行 每个测试方法。因此,使用事务意味着测试方法之间不会存在持久性。

但是,您可以在 testLogout 测试中再次生成令牌。由于您的注销测试依赖于存在的令牌,因此该方法本身没有任何错误。