laravel 如何在PHPUnit中运行测试时更改数据集名称?(使用DataProvider)

jpfvwuh4  于 2023-05-08  发布在  PHP
关注(0)|答案(1)|浏览(95)

是否有方法在运行时重命名DataProvider数据集(当测试正在运行时)?
我有一个Trait,它具有动态生成数据集的DataProvider。但是当DataProvider方法运行时,我不能给予它们描述性的名称,因为我期望不同的结果取决于使用此Trait的特定TestCase,并且我不能弄清楚我期望的结果,因为我的setUp方法还没有被调用。
我举个例子:我有一个特性,检查页面是否可以通过各种用户权限组合访问。而我现在在报告里能看到的就是

check access with dataset "permissions: allow_this"
check access with dataset "permissions: allow_this, allow_that"

我希望看到更多的描述性名称,如

check access with dataset "deny when permissions: allow_this"
check access with dataset "allow when permissions: allow_this, allow_that"

但是为了弄清楚是否应该允许用户访问这个页面,我必须检查我的DB中的一些数据,但是我只能稍后在我的setUp方法中执行,该方法还没有被调用。
是的,我已经知道调用setUp后的预期结果,但似乎我现在已经无法重命名数据集...还是我可以

**Upd4@mrhn:**dataProvider运行时无法给出描述性名称的示例:

class VehiclesEditPageTest extends TestCase
{
    use BasicResponseTestWithAuth;

    public function setUp():void {
        parent::setUp();

        $vehicle = Vehicle::create([
            'number' => 'x000xx00',
        ]);
        $this
            ->setBasicResponseTestPageUrl(route('admin.dataobjects.vehicles.edit', $vehicle->id))
            ->setBasicResponseTestRequiredPermissions(['can_access_admin_zone', 'can_access_dataobjects_zone']);
    }
}

一部分是Trait:

trait BasicResponseTestWithAuth {
    use RefreshDatabase;

    private $basicResponseTestPageUrl;
    private $basicResponseTestRequiredPermissions = ['--no--access--'];  // no access by default
    private $basicResponseTestAuthorizedRedirectsToUrl;

    // ...

    public function test_access($shouldAccess, $permissions) {
        // have to figure it out here, not in dataProvider method
        $shouldAccess = $this->basicResponseTestShouldAccess($permissions);

        $user_role = UserRole::factory()->create($permissions);
        $user = User::factory()->create([
            'user_role_id' => $user_role->id,
        ]);
        $this->actingAs($user);

        $response = $this->get($this->basicResponseTestPageUrl);

        if(!$shouldAccess) {
            $response->assertStatus(403);
        } else {
            $response->assertStatus(200);
        }
    }

    // ...

    public function provide_access_data() {
        $data = array_map(
            function ($permissions) {
                return [
                    $this->basicResponseTestShouldAccess($permissions), // <-- it doesnt work properly here, so we recall it later in TEST method
                    $permissions
                ];
            },
            $this->getAllPermissionsCombinations()
        );
        $data_named = array_combine(
            // ...therefore here we have all tests named as "deny for ...."
            array_map(fn($data) => ($data[0] ? 'allow for   ' : 'deny for   ') . implode(' + ', array_keys(array_filter($data[1]))), $data),
            $data
        );
        return $data_named;
    }

}

正如你所看到的,我必须在我的DB中创建一个Vehicle对象,以便测试Vehicle Edit页面的响应。
我本可以用setUp方法制作所有其他的设置内容(例如.使用私有方法来设置页面url和所需的权限),但我不能在测试生命周期AFAIK的早期做任何DB的事情。
我想在这里只设置路由名称和模型的类(使用类方法),并在trait的Test方法中创建模型,但它似乎不是一站式和可重用的解决方案,因为其他一些页面可能需要创建smth different,然后只需要一个模型来测试它的可访问性。

更新2:

今天在看了这篇文章之后,我想到了一个单独初始化的想法(在属性中设置权限,使它们可以在dataProvider中访问,以计算预期的结果,然后当数据库连接准备好使用时,在setUp方法中设置页面URL)。
似乎不是很优雅,虽然应该工作,据我所知。

tcomlyy6

tcomlyy61#

我最近遇到了这个问题,但主要是PHPStorm测试运行器如何更改输出。
通过这一点,我发现可以使用dataprovider()的数组结构来实际调整名称。通过使用用于命名目的的键,这不会改变测试的执行。
如果您将这个想法应用到数据提供程序。

function dataProvider() {
    return [
        'deny when permissions' => ['permissions: allow_this'],´
    ];
}

您将根据PHPUnit默认转换数据的方式获得以下结果。我想这就足够了。

check access with dataset with data set "deny when permissions" ('permissions: allow_this, allow_that')

相关问题