2010-07-27 108 views
0

所以我想在我的Web項目中測試我的一個函數,但它實際上並沒有連接到項目中的任何東西(其他人正在處理該部分)。函數接受一個「ID」字段,關閉並執行一些查詢並獲取一些數據,對其執行一些計算,然後將一堆行寫入FileStream並返回該流。我幾乎只想通過將文件寫入本地計算機並在函數完成後使用該文件目錄來測試它。MVC項目中的測試功能

所以我的問題主要是:

1)我如何調用該函數只是爲了測試目的,所以我可以測試所有的查詢/計算/文件寫入等而不會被連接到應用程序的其它部分只是還沒有。

2)如何更改FileStream的'Return fs'以在本地寫入我自己的計算機以查看已寫入的文件。

謝謝你們!

回答

0

爲了讓您的功能可測試,你需要將所有的依賴隔離,並與存根嘲笑你的測試替換它們。你可以通過圍繞文件系統類來實現這一點,並確保你的數據層類具有接口。有了這個代碼可能看起來像:

public class Something 
{ 
    IDataProvider provider; 
    IFileSystem fileSystem; 
    public Something(IDataProvider provider, IFileSystem fileSystem) 
    { 
    this.provider = provider; 
    this.fileSystem = fileSystem; 
    } 

    void DoThing(int id) 
    { 
     // make database call to get data 
     var data = provider.GetData(id); 

     fileSystem.Write("someFilePath",data); 
    } 

} 

有了這個,你可以寫(使用Moq樣的語法在這個外殼)測試這樣:

void SomeTest() 
{ 
    var mockDataProvider = new Mock<IDataProvider>(); 
    var mockFileSystem = new Mock<IFileSystem>(); 
    var something = new Something(mockDataProvider.Object, mockFileSystem.Object); 
    var data = "someData"; 
    mockDataProvider.Setup(x => x.GetData(5)).Return(data); 

    DoThing(5); 

    mockFileSystem.Verify(x => x.Write("someFilePath",data); 


} 
0

您需要閱讀單元測試,因爲這樣可以在很多方面解決您的問題 - 它還會向您介紹依賴注入和嘲笑,這將是處理您的問題的好方法。

這裏是一個概述...

設置您的類,以便它接受在構造函數中的數據訪問和文件作家。然後,您可以傳遞數據訪問和文件寫入器的模擬或存根版本,因此您不需要連接到數據庫或寫入文件系統來測試代碼。

在「真實世界」中,您傳入了真正的數據訪問和文件編寫器。

在「測試世界」中,您可以使用諸如MOQ或Rhino Mocks之類的東西來創建數據訪問的假裝版本,這意味着您可以預測每次測試時數據訪問會返回的內容,因爲它不是真實的數據庫,它是你準備好的一些數據。你也可以創建一個假冒的文件編寫器,它實際上並不需要編寫一個真正的文件。

然後,您可以單獨測試您的班級。

依賴注入:

http://msdn.microsoft.com/en-us/magazine/cc163739.aspx

起訂量

http://code.google.com/p/moq/