是否有方法在运行时重命名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)。
似乎不是很优雅,虽然应该工作,据我所知。
1条答案
按热度按时间tcomlyy61#
我最近遇到了这个问题,但主要是
PHPStorm
测试运行器如何更改输出。通过这一点,我发现可以使用
dataprovider()
的数组结构来实际调整名称。通过使用用于命名目的的键,这不会改变测试的执行。如果您将这个想法应用到数据提供程序。
您将根据
PHPUnit
默认转换数据的方式获得以下结果。我想这就足够了。