我正在为一个组件编写一个单元测试,并且很难伪造一些数据。我想知道是否有可能在另一个类的类中引用变量?
设置示例:
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;
}
答案 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 */
}