全局变量的任何替代方案?我不想在phpunit测试中使用全局变量

时间:2014-07-25 04:40:47

标签: php json phpunit scope global

我使用phpunit创建了一些测试,但遇到了一个小问题。我在类之外创建了一个$json字符串,并且我在测试函数中使用它,以避免重复的变量声明,因为将有许多其他测试使用相同的$json字符串。 / p>

现在我一直在阅读我们不应该如何使用全局变量,因为它可能会导致代码的可维护性出现问题,因此我试图找出另一种方法来运行此测试。 / p>

我考虑为要接受的函数创建参数,但是当我运行phpunit时这些函数会自动运行。

这是我的代码:

$json = '{ 
                "name": "John", 
                "age": "22", 

             }';

    $data= json_decode($json, true);
    $name = $data['name'];
    $age = $data['age'];


 class UserTest extends TestCase {




 public function testCreateUserName(){
    global $json;
    global  $name;

    $this->call('POST', 'user', array(), array(), array(), $json);

    $this->assertFalse($this->client->getResponse()->isOk());

    $decodedOutput = json_decode($this->client->getResponse()->getContent());

    $this->assertEquals($name, $decodedOutput->name, 'Name Input was Incorrect');
    $this->assertResponseStatus(201);


}

}

我的问题是,除此之外的另一种选择是什么?

2 个答案:

答案 0 :(得分:1)

为什么不用setUp()方法创建数据?

示例:

class UserTest extends TestCase {

  private $data;
  private $json;
  private $name;
  private $age;

  public function setUp() {
    $this->json = '{ 
                "name": "John", 
                "age": "22", 

             }';
    $this->data = json_decode($this->json, true);
    $this->name = $this->data['name'];
    $this->age = $this->data['age'];
  }

  public function testCreateUserName(){
      $this->call('POST', 'user', array(), array(), array(), $this->json);

      $this->assertFalse($this->client->getResponse()->isOk());

      $decodedOutput = json_decode($this->client->getResponse()->getContent());

      $this->assertEquals($this->name, $decodedOutput->name, 'Name Input was Incorrect');
      $this->assertResponseStatus(201);
  }  
}

有关详细信息,请参阅此链接:

http://phpunit.de/manual/4.1/en/fixtures.html

答案 1 :(得分:1)

在执行每个测试以初始化类变量之前,您应该使用PHPUnit调用的setUp()方法。

class UserTest extends TestCase
{
    protected $json;
    protected $name;
    protected $age;

    public function setUp()
    {
        $this->json = '{"name":"John","age":22}';
        $data = json_decode($this->json);
        $this->name = $data['name'];
        $this->age = $data['age'];
    }

    public function testCreateUserName()
    {
        // ...
    }
}

每次测试后都会调用一个对称方法teardown(),但很少需要定义此方法。

有关详细信息,请查看Fixtures上的PHPUnit手册页。我建议您进一步查看手册,了解有关如何相互依赖测试或让一个测试为另一个测试提供数据的信息。