PHP单元:创建要使用的公共对象


PHP Unit: Create common object to work with

我正在为一个类编写PHP单元测试,它会发出一些curl请求。目前,每个测试都以我的类实例初始化和登录指令开始,并以注销指令结束,例如

public function testSomeMethod(){
        $a = new myClass();
        $a->login();
        ....
        $a->logout();
        $this->assertTrue($smth);

我想创建一个公共对象$a = new myClass(),在所有测试之前调用登录方法,在所有测试之后调用注销方法。我该怎么做呢?

根据这里的PHPUnit文档,你可以使用以下钩子方法:

setUp()和tearDown()模板方法为每个测试运行一次方法(以及在新的实例上)。

此外,还有setUpBeforeClass()和tearDownAfterClass()模板方法在运行测试用例类的第一个测试之前调用以及在运行测试用例类的最后一个测试之后。

在您的情况下,您可以将登录类定义为类成员,并在setUpBeforeClass()方法中实例化(login),并在tearDownAfterClass()中执行注销

<<p> 编辑:例子/strong>

考虑以下类:

namespace Acme'DemoBundle'Service;

class MyService {

    public function login()
    {
        echo 'login called'.PHP_EOL;
    }
    public function logout()
    {
        echo 'logout called'.PHP_EOL;
    }
    public function doService($name)
    {
        echo $name.PHP_EOL;
        return $name;
    }
}

这个测试用例:

use Acme'DemoBundle'Service'MyService;
class MyServiceTest extends 'PHPUnit_Framework_TestCase {
    /**
     * @var 'Acme'DemoBundle'Service'MyService
     */
    protected static $client;
    public static function setUpBeforeClass()
    {
        self::$client = new MyService();
        self::$client->login();
    }
    public function testSomeMethod1()
    {
        $value = self::$client->doService("test1");
        $this->assertEquals("test1",$value);
    }
    public function testSomeMethod2()
    {
        $value = self::$client->doService("test2");
        $this->assertEquals("test2",$value);
    }
    public static function tearDownAfterClass()
    {
        self::$client->logout();
    }
}

转储以下输出:

login called .test1 .test2 logout called

时间:49 ms,内存:6.00Mb

OK (2 test, 2 assertion)

希望对您有所帮助

在类级别创建可重用/通用对象(用于方法/函数)@Matteo的回答很有帮助,这是我的实现

不需要多重继承,或者__construct()构造函数,我花了很多时间在这上面(特别是来自java背景)

<?php
namespace Tests'Unit;
use Tests'TestCase;
use App'Services'HelperService;
class HelperServiceTest extends TestCase
{ 
    //Object that will be reused in function()'s of this HelperServiceTest class itself 
    protected static $HelperServiceObj;
   //this is the magic function
    public static function setUpBeforeClass()
    {
        self::$HelperServiceObj = new HelperService();
    }
    public function testOneHelperServiceToBeTrue()
    {
          $this->assertTrue(self::$HelperServiceObj->getValue());
    }
   public function testTwoHelperServiceToBeTrue()
    {
          $this->assertTrue(self::$HelperServiceObj->getValueTwo());
    }
}

请参考官方文档setUp(), setUpBeforeClass(), tearDown()了解setUpBeforeClass()等神奇函数

HelperServiceTest类中getValue()函数的示例实现

<?php
namespace App'Services;
class HelperServiceTest
{
    function getValue(){
       return true;
    }
    function getValueTwo(){
       return true;
    }
}