【问题标题】:Unit Test - Referencing Class' Class' Variable单元测试 - 引用类'类'变量
【发布时间】:2013-10-18 17:41:05
【问题描述】:

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

设置示例:

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;
}

【问题讨论】:

    标签: php class extends


    【解决方案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 */
    }
    

    【讨论】:

    • @icu222much 在测试用例中添加了一个注入示例
    • 明白了。现在我明白了使用setter方法setSports()的意思。不幸的是,我的人类班没有setSports()。相反,它通过 $sport = new Sports(); return $sport-&gt;getHtml($data); 创建 Sports 类。
    • 是的,如果你控制了Human的来源,你应该实现依赖注入。有很多方法可以用更神奇的方式模拟类,但我建议做 DI,因为学习和使用它会使你的代码和作为开发人员的你变得更好。
    • 我不允许修改Human的来源。我会调查另一种选择。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多