在setupBeforeClass之后有没有办法执行dataprovider函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在setupBeforeClass之后有没有办法执行dataprovider函数?相关的知识,希望对你有一定的参考价值。
我有一个单元测试类,其中我想从另一个类实例化一个对象,以便我使用phpunit的setUpBeforeClass()fixtures。因此,如果我将在测试函数中直接使用最近实例化的对象,那么它的工作正常。
如果我将此对象用于为数据提供者创建的另一个函数。因此该对象设置为null会导致提供程序始终首先执行。
有没有办法在测试运行之前调用dataProviders,而不是?
require_once('Dashboard.php');
Class Someclass extends PHPUnit_Framework_TestCase {
protected static $_dashboard;
public static function setUpBeforeClass()
{
self::$_dashboard = new Dashboard();
self::$_dashboard->set_class_type('Member');
}
/**
* Test Org Thumb Image Existense
* param org profile image : array
* @dataProvider getOrgProfileImages
*/
public function testFieldValidation($a,$b){
//If I call that object function here it will give the result.
//$members = self::$_dashboard->get_members();
//var_dump($members); Printing result as expected
$this->assertTrue(true);
}
public function getOrgProfileImages() : array {
//var_dump(self::$_dashboard);
$members = self::$_dashboard->get_members();
$tmp_array = ['2','2'];
return $tmp_array;
}
public static function tearDownAfterClass()
{
self::$_dashboard = null;
}
}
错误:为Someclass :: testFieldValidation指定的数据提供程序无效。在null上调用成员函数get_members()
请帮助缓解此问题。
注意:由于我没有你的
Dashboard
类的来源,我在下面的例子中使用了一个随机数
在任何测试运行之前(在任何钩子之前,包括beforeClass
有机会运行)之前,都会调用提供程序。到目前为止,实现您所需要的最简单方法是在类加载上填充该静态属性:
use PHPUnitFrameworkTestCase;
/** @runTestsInSeparateProcesses enabled */
class SomeTest extends TestCase
{
public static $_rand = null;
public function provider()
{
$rand = self::$_rand;
var_dump(__METHOD__, getmypid(), 'provided rand', $rand);
return ['rand' => [$rand]];
}
/** @dataProvider provider */
public function testSomething($rand)
{
$this->expectNotToPerformAssertions();
var_dump(__METHOD__, getmypid(), 'tested with', $rand);
}
/** @dataProvider provider */
public function testSomethingElse($rand)
{
$this->expectNotToPerformAssertions();
var_dump(__METHOD__, getmypid(), 'tested with', $rand);
}
}
// this runs before anything happens to the test case class
// even before providers are invoked
SomeTest::$_rand = rand();
或者您可以在第一次调用时在提供程序本身中实例化您的仪表板:
public function provider()
{
// Instantiate once
if (null === self::$_rand) {
self::$_rand = rand();
}
$rand = self::$_rand;
var_dump(__METHOD__, getmypid(), 'provided rand', $rand);
return ['rand' => [$rand]];
}
@ dirk-scholten是对的。您应该为每个测试创建一个新对象。这是一个很好的测试实践。坦率地说,它看起来更像是在测试数据而不是测试代码,这很好,我想,这不是PHPUnit的典型用法。基于您希望确保数据库中的每个用户都有缩略图(只是猜测)的假设,我会使用以下内容:
<?php
class DashboardDataTest extends PHPUnitFrameworkTestCase {
private $dashboard;
public function setUp() {
$this->dashboard = new Dashboard();
}
/**
* Test Org Thumb Image Existence
* param org profile image : array
*
* @dataProvider getOrgProfileImages
*
* @param int $user_id
*/
public function testThumbnailImageExists(int $user_id){
$thumbnail = $this->dashboard->get_member_thumbnail($user_id);
$this->assertNotNull($thumbnail);
}
public function geOrgUserIDs() : array {
$dashboard = new Dashboard();
// Something that is slow
$user_ids = $dashboard->get_all_the_member_user_ids();
$data = [];
foreach($user_ids as $user_id){
$data[] = [$user_id];
}
return $data;
}
}
每个数据提供程序将在测试之前调用一次且仅调用一次。您不需要在类上使用静态数据夹具,因为当您使用数据提供程序时,phpunit会为您处理数据夹具。
以上是关于在setupBeforeClass之后有没有办法执行dataprovider函数?的主要内容,如果未能解决你的问题,请参考以下文章
使用 OrmLite,有没有办法在我的 POCO 被修改时自动更新表模式?