PHPUnit 6.1.x 在我的测试类使用自己的构造函数方法时引发 array_merge() 错误

2022-08-30 12:53:19

我收到此错误:

1) XTest::testX
array_merge(): Argument #1 is not an array

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

在此测试用例中:

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{

    function __construct()
    {}

    function testX()
    {
        $this->assertTrue(true);
    }
}

如果我删除方法,我的测试通过。PHPUnit 对我的类构造函数方法的处理是怎么回事?它在PHPUnit版本4.8中工作正常,但现在我使用的是PHPUnit版本6.1.3__construct


答案 1

PHPUnit 使用构造函数来初始化基TestCase

您可以在此处查看构造函数方法:https://github.com/sebastianbergmann/phpunit/blob/6.1.3/src/Framework/TestCase.php#L328

public function __construct($name = null, array $data = [], $dataName = '')

你不应该使用构造函数,因为它被phpunit使用,对签名等的任何更改都可能破坏东西。

您可以使用 phpunit 将为您调用的特殊和方法。setUpsetUpBeforeClass

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{
    function static setUpBeforeClass()
    { 
       // Called once just like normal constructor
       // You can create database connections here etc
    }

    function setUp()
    {
      //Initialize the test case
      //Called for every defined test
    }

    function testX()
    {
        $this->assertTrue(true);
    }

    // Clean up the test case, called for every defined test
    public function tearDown() { }

    // Clean up the whole test class
    public static function tearDownAfterClass() { }
}

文档:https://phpunit.de/manual/current/en/fixtures.html

请注意,为类中的每个指定测试调用 。setUp

对于单个初始化,可以使用 。setUpBeforeClass

另一个提示:使用标志运行phpunit以显示堆栈跟踪;)-v


答案 2

正如Sander Visser的回答正确指出的那样,父构造函数可能具有其他参数等,通常您希望使用或,但是,如果您知道自己在做什么,则可以调用Test类的构造函数:setUpBeforeClasssetUpparent::__construct();

public function __construct() {
    parent::__construct();
    // Your construct here
}

编辑2019

在Codeception中,这也可能是由套件文件上的无效YML缩进引起的。


推荐