单元测试 - 引用类'类'变量

时间:2013-10-18 17:41:06

标签: php class extends

我正在为一个组件编写一个单元测试,并且很难伪造一些数据。我想知道是否有可能在另一个类的类中引用变量?

设置示例:

Unit Test > Human > Sports > $this->option['duration']

我正在为我的Human课程编写单元测试。 Human类调用Sports类,Sports类引用自己的变量$this->option['duration']。我希望能够从单元测试中修改$this->option['duration']的值。我想知道这是否可能?

我试图在我的单元测试中创建一个运动的模拟类,并在这个模拟类中设置我想要的$this->option['duration']值。然而,我不知道如何将我的模拟体育课程注入我的单元测试。

class SportsMock extends Sports {
    $this->option[duration'] = 10;
}

1 个答案:

答案 0 :(得分:1)

对于这种模拟,你需要在类上进行依赖注入(DI)。

我的意思是,你的Human类不应该实例化Sports,而是在构造函数中接受它,或者 - 甚至更好 - 通过setter方法。这样,您可以轻松地创建一个模拟类,实例化它并将其注入您要测试的类的实例中。

class Human {
    /* ... */
    function setSports(Sports $sports) {
        $this->sports = $sports;
        return $this;
    }
    /* ... */ 
}

现在,在测试中,您可以从Sports扩展,以便它可以与setter一起使用。

/* You can override any function in the original, to return some mock data */
class MockSports extends Sports {
    public $mock_data = array();
    function original_function() {
       return $mock_data['original_function'];
    }
}

虽然这可能适合您的需求,但测试库通常带有适当的模拟实用程序,这使得模拟更加方便,但这并没有改变事实,即DI使测试代码变得更加容易。

示例:

function my_example_test() {
    $human = new Human();
    $mock_sports = new MockSports();
    $mock_sports->mock_data['original_function'] = 10;
    $human->setSports($mock_sports); // <-- here is the injection
    /* Below you can test if your human works like it should */
}