如何为 PHPunit 测试设置特定的类属性?

dan*_*car 3 php phpunit unit-testing

phpunit 在测试中设置一些默认配置值的最佳实践是什么?

我正在考虑类似的价值观

  • 用户名
  • 客户 ID 号
  • 很快..

    通常我会使用构造函数或一些设置器来设置它,但当我只有这样的类时我不知道如何做到这一点

    class RestTest extends PHPUnit_Framework_TestCase {
    
    Run Code Online (Sandbox Code Playgroud)

    例如,我正在尝试为 REST 和 SOAP 服务制作测试用例。

    我需要指定 url/用户并通过,但它们在开发/测试/生产时发生变化,因此我需要一种干净的方法来指定它们。

  • edo*_*ian 5

    如果您在测试的每个测试用例中都需要一些默认值(例如 UserId),我建议您在setUp类的方法中设置这些值。

    只是设置值的示例:

    class MtTest extends PHPUnit_Framework_TestCase {
    
        // As a property
        private $testUser = 7;
    
        // In the setUp
        public function setUp() {
            $this->testUser = 7;
            $this->defaultName = "BOB";
            $this->MtClass = new Mt();
        }
    
        public function testFoo() {
             $this->assertTrue($this->MtClass->userExists($this->testUser));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果您需要将一组值输入到一个测试方法中,请使用建议的 @SilverLight (+1) 等 DataProvider。

    回复评论:

    如果您需要某种环境设置(对于您想要执行的任何操作,我现在只使用用户名,因为我无法猜测)您可以在您的PHPUnit Bootstrap(或您传递给 --bootstrap 的文件)中设置它们:

    引导程序.php

    <?php
    define("PHPUnit_Username", "Fuuu");
    // or
    $phpunitConfig = new Array(
         "username" => "fuu",
    )
    // or whatever suits you there. No reason for me to type a config object i guess
    class MyPHPUnitConfig {
         public function getUsername() { return "wtf"; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    也许有你自己的基础测试类

    <?php
    class MyBaseTest extends PHPUnit_Framework_TestCase {
    
        public function setUp() {
            parent::setUp();
            $this->config = new MyPHPUnitConfig();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并以此为基础延伸。或者setUpBeforeClass每个测试类只执行一次。


    如果这不能回答你的问题,我只是不明白你的意思。这是一个测试用例,它没有任何强依赖性,而且kinda shouldn't have any (Isolation)我不认为您的问题是如何将值放入您的 setUp 函数中,是吗?(因为这不是 phpunit 问题)。

    让我知道这是否有帮助