如何在PHPUnit中的不同测试中共享对象

时间:2014-07-30 13:05:58

标签: php zend-framework phpunit

我有以下类'MyControllerTest'用于'MyController'的测试目的。 我想在这个类的不同测试中共享同一个对象'$ algorithms'但我不知道在尝试在不同的地方添加变量后如何做到这一点:

class MyControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    // $algorithms = ...   <----- does not work
    public static function main()
    {
        $suite = new PHPUnit_Framework_TestSuite("MyControllerTest");
        $result = PHPUnit_TextUI_TestRunner::run($suite);
    }

    public function setUp()
    {
        $this->bootstrap = new Zend_Application(
                'testing',
                APPLICATION_PATH . '/configs/application.ini'
        );
        $configuration = Zend_Registry::get('configuration');
        // $algorithms = ...   <----- does not work
        parent::setUp();
    }

    public function tearDown()
    {

    }
    public function test1() {
        // this array shared in different tests
        $algorithms[0] = array(            

                        "class" => "Mobile",
                        "singleton" => "true",
                        "params" => array(
                                "mobile" => "true",
                                "phone" => "false"
                                )
                    );

        ...  
    } 
    public function test2() { };

}

我如何分享这个对象? 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

你在这里有几个选择

  1. 将数据夹具声明到setUp方法中并声明一个保存它的私有变量。所以你可以在其他测试方法中使用它。

  2. 在您的测试类中声明一个包含数据夹具的私有函数。如果您需要数据夹具,只需调用私有方法

  3. 使用保存数据夹具的方法创建一个Utiltity类。 Utility类在setUp函数中初始化。在MyControllerTest中声明一个包含Utility类实例的私有变量。当测试需要夹具时,只需从Utility实例调用fixture方法。

  4. 示例1

    class MyControllerTest extends Zend_Test_PHPUnit_ControllerTestCase 
    {
      private $alg;
    
      public function setUp()
      {
        # variable that holds the data fixture
        $this->alg = array(....);
      }
    
      public function test1()
      {
         $this->assertCount(1, $this->alg);
      }
    }
    

    示例2

    class MyControllerTest extends Zend_Test_PHPUnit_ControllerTestCase 
    {
      public function test1()
      {
         $this->assertCount(1, $this->getAlgo());
      }
    
      # Function that holds the data fixture
      private function getAlgo()
      {
        return array(....);
      }
    }
    

    示例3

    class Utility
    {
      # Function that holds the data fixture
      public function getAlgo()
      {
        return array(....);
      }
    }
    
    class MyControllerTest extends Zend_Test_PHPUnit_ControllerTestCase 
    {
      private $utility;
    
      public function setUp()
      {
        $this->utility = new Utility();
      }
    
      public function test1()
      {
         $this->assertCount(1, $this->utility->getAlgo());
      }
    }
    

    但要注意在某些测试中共享并更改的灯具。这真的搞砸了你的测试套件。