2010-09-26 35 views
1

我有一個使用Silverlight Unit Test Framework的Silverlight測試項目。如何在沒有SecurityException的Silverlight中的視圖模型中爲此方法編寫單元測試?

我想在我的視圖模型中測試一個採用FileInfo對象的方法。當我通過UI手動測試時,這似乎工作正常。

現在我想要一個單元測試只是爲了AddDocument方法。我不想測試實際點擊按鈕或模擬點擊按鈕 - 我只想測試AddDocument方法。

下面是從視圖背後的代碼。 mySessionViewModel對象位於DataContext中。我想測試的方法是mySessionViewModel.AddDocument();

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

    openFileDialog1.Filter = 
     "Text Files (.txt)|*.txt|All Files (*.*)|*.*"; 
    openFileDialog1.FilterIndex = 1; 

    openFileDialog1.Multiselect = true; 

    bool? userClickedOK = openFileDialog1.ShowDialog(); 

    if (userClickedOK == true) 
    { 
     IList<FileInfo> files = new List<FileInfo>(); 
     foreach (FileInfo file in openFileDialog1.Files) 
     { 
      mySessionViewModel.AddDocument(file); 
     } 
    } 
} 

我把一些測試文件在Web項目的子目錄,並嘗試這樣做,但將使用Silverlight的安全模型一致的一個SecurityException:

SessionView sessionViewModel = new SessionViewModel(); 

DirectoryInfo di = new DirectoryInfo("testFiles"); 
var files = di.EnumerateFiles(); 
foreach (var file in files) 
{ 
    sessionViewModel.AddDocument(file); 
} 

// assert some stuff 

回答

2

這裏的主要問題是你想單元測試一個方法,它需要一個FileInfo作爲參數。但是沒有自動化的方式來創建FileInfo的實例。

因此,要單元測試此方法,您應該考慮更改參數的類型。很可能這種方法的內部只能訪問FileInfo上的一些屬性和方法。因此,創建一個代表這些成員的界面,並直接改變使用界面的方法而不是FileInfo

現在您可以爲FileInfo創建一個實現該接口的包裝類,並且您還可以創建另一個類用於單元測試,該類實現相同的接口但在其他位置獲取其內容。

+0

安東尼謝謝。我嘗試使用FileStream類型作爲參數,而不是FileInfo - 我想讀取該文件。 Silverlight文檔說你可以使用它訪問文件系統(有限制,例如路徑不可見)。但仍然得到SecurityException。 – 2010-09-26 08:31:24

+0

@Nick Miller:嘗試使用更基本的* Stream *作爲參數類型,並讓測試提供ResourceStream的 – 2010-09-26 08:46:40

+0

@Nick:如果'FileInfo'由'OpenFileDialog'提供,則只能這樣做。此外,傳入流中負擔的開放和處置調用代碼這不是一個好的選擇只是爲了支持測試流。即使只有一個'OpenRead'方法,我仍然會使用包裝。現在,如果你的代碼可以與之一起工作,你可以選擇讓'OpenRead'返回一個'Stream'。如果不使用'FileStream',但你的模擬包裝需要使用'IsolatedStorageFileStream'(使用'Stream',你也可以選擇使用'StreamResourceInfo.Stream')。 – AnthonyWJones 2010-09-26 14:33:57

2

Silverlight的安全模式不會允許文件訪問除非它通過文件打開對話框(這是在瀏覽器中)。

此外,文件打開對話框當然只能從用戶界面事件(鼠標點擊等)中觸發。

閱讀外部文件的能力並不是真正需要自動測試的東西。單個交互式UI測試將證明這一點。

對於自動測試,要測試文件的處理邏輯,可以使用測試項目內部的文件,例如引用爲資源。

相關問題