2013-06-21 20 views
1

單元測試在開發過程中很重要。但是,測試一些代碼並不容易。如何測試嚴重副作用的代碼?

如果我有這樣的一些代碼:

class Filesystem(): 

    def destroy(self, fs): 
     os.system("mkfs.ext4 %s" % fs) 
     #assert(self.size(fs) == 0) 

我不能毀了一個測試的文件系統。

對於這種情況,我可以在UNIX上爲測試創建一個基於文件的驅動器。

但是,如果它是一個API類:

class Blog(): 

    def post(self, text): 
     blog.library.post(self.access_key, text) 

我不想張貼測試一個博客文章。

我該怎麼辦?

回答

4

單元測試:

您的類不應該直接blog.library,而是通過你注射的Blog類依賴一些中間層交互。對於測試,你爲它創建一個模擬並聲明期望的方法是用預期的參數調用的。

對於功能/集成測試:

您設置一個虛擬的博客引擎和執行實際的職位。然後檢查該帖子是否確實出現在http請求的頁面上。

3

不是專家,但我相信嘲笑是答案。

你不想發表一篇文章,實際上你的測試代碼根本不期望文章,你只需要僞造一個對象(我們稱之爲:嘲笑)並讓它的行爲就像一個真實的文章,所以你的真實代碼將完成它的工作,這就夠了。

請記住,測試的目的是確保您的代碼正常工作。在面向對象編程中,我們將所有對象都視爲對象,因此當您發佈文章時,它實際上會創建一個代表真實世界中真實文章的對象。嘲笑一個虛假的對象足以表達你的代碼的行爲,所以你不必寫一篇真實的文章,只是爲了證明你的代碼將創建一個對象,這可能是一個帖子是相當不夠的。

1

正如其他人所說的那樣,嘲笑會在這裏得到您的幫助。有一些嘲諷可用的框架 - 我喜歡的Mockito,因爲它似乎是最直觀的(我反正)

我發現this article涵蓋了基礎知識非常快速,清晰地

的Mockito不能嘲笑靜態方法,但可以與PowerMock一起使用來實現此目的。一般情況下(尤其是SO)在網絡上存在大量的例子來說明如何做到這一點。話雖如此,我總覺得不得不回頭使用PowerMock通常會指向我的代碼中的某些臭味。

編輯

剛剛意識到我是從Java的角度說話,不會出現成爲當前的envirnoment

編輯完

1

像阿爾貝說,它應該是mock up entity

在.NET中,我讓你想測試virtual這些方法,這樣我可以在一個MockedBlog現在這個MockedBlogBlog延長真實實體將有Post()override方法和我檢查mm測試是達到這個方法是這樣的:

public class MockedBlog : Blog 
{ 
    public void override Post(string text) 
    { PostMethodWasCalled = true; } 

    public bool PostMethodWasCalled {get;set;} 
} 

在測試中,我會做這樣的事情

var mockup = new MockedBlog(); 
// do the preparation, then post 
mockup.Post("hello world"); 
Assert.IsTrue(mockup.PostMethodWasCalled);