0

我正在为一个组件编写一个单元测试,并且在伪造一些数据时遇到了麻烦。我想知道是否可以在另一个类的类中引用一个变量?

设置示例:

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

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

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

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

1 回答 1

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 */
}
于 2013-10-18T17:51:02.370 回答