2013-10-18 69 views
0

我正在爲組件編寫單元測試,並且無法僞造一些數據。我想知道是否可以在另一個類的類中引用一個變量?及設置單元測試 - 引用類「類」變量

例子:

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

我寫我的人類單元測試。 Human類調用Sports類,Sports類引用自己的變量$this->option['duration']。我希望能夠從我的單元測試中修改$this->option['duration']的值。我想知道這是否可能?

我試過在我的單元測試中創建一個運動模擬類,並在這個模擬類中設置我所期望的值$this->option['duration']。然而,我不知道如何將我的模擬體育課注入到我的單元測試中。

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

回答

1

對於這種嘲笑,你需要在你的類上有依賴注入(DI)。

我的意思是說,你的人類不應該實例化體育,而是在構造函數中接受它,甚至更好 - 通過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 */ 
} 
+0

我如何告訴'Human'使用'SportsMock'? – Jon

+0

@ icu222much在測試用例 – aorcsik

+0

Got'cha上添加了一個注入示例。現在我通過使用setter方法'setSports()'瞭解你的意思。不幸的是我的Human類沒有'setSports()'。相反,它通過'$ sport = new Sports()創建Sports類;返回$ sport-> getHtml($ data);'。 – Jon