2013-01-21 16 views
0

我的代碼看起來如下:如何單元測試返回func的字典?

public class FileFormatLookup : Dictionary<string,Func<string>> 
{ 
    private Workbook workbook; 
    private MemoryStream memoryStream; 

    public FileFormatLookup(Workbook workbook, MemoryStream memoryStream) 
    { 
     this.workbook = workbook; 
     this.memoryStream = memoryStream; 
     Add(); 
    } 

    private void Add() 
    { 
     base.Add("xls",() => 
          { 
           workbook.Save(memoryStream, SaveFormat.Excel97To2003); 
           return "ms-excel"; 
          }); 
    } 
} 

,我試圖寫如下的測試:

class FileFormatLookupTest 
{ 
    FileFormatLookup fileFormatLookup; 
    private Workbook workbook; 
    private MemoryStream memoryStream; 

    [SetUp] 
    public void SetUp() 
    { 
     fileFormatLookup = new FileFormatLookup(workbook, memoryStream); 
     workbook = MockRepository.GenerateMock<Workbook>(); 
     memoryStream = MockRepository.GenerateMock<MemoryStream>(); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     workbook.VerifyAllExpectations(); 
    } 


    [Test] 
    public void ShouldHaveXlsKey() 
    { 
     var xlsResult = fileFormatLookup["xls"].Invoke(); 
     workbook.AssertWasCalled(x=>x.Save(memoryStream,SaveFormat.Excel97To2003)); 
    } 
} 

這是測試內部字典中的仿函數的正確方法是什麼? 它拋出這個錯誤:

System.InvalidOperationException : No expectations were setup to be verified, ensure that the method call in the action is a virtual (C#)/overridable (VB.Net) method call 

如何測試,它返回一個函數的字典?可能嗎? 我可以斷言返回的字符串值,但不是方法調用。

回答

2

你不會把你的嘲弄傳遞給被測試的類。

更改設置,以

[SetUp] 
public void SetUp() 
{ 
    workbook = MockRepository.GenerateMock<Workbook>(); 
    memoryStream = MockRepository.GenerateMock<MemoryStream>(); 
    fileFormatLookup = new FileFormatLookup(workbook, memoryStream); 
} 

從錯誤信息,它看起來像需要設置的期望,即它要求你期待的模仿對象。在這種情況下workbook.Save(...)

要做到這一點,workbook.Save(...)必須是虛擬的或在接口上。


編輯:後爲註釋提供了進一步的信息。

如果workbook.Save(...)不是虛擬的並且不在您的代碼中,您必須稍微長一點才能測試該對象。

創建自己的IWorkbook接口,實現了Save()方法,那麼WorkbookWrapper類,它包含了第三方Workbook類的一個實例,並轉發到被包裝類的調用實現IWorkbook

public interface IWorkbook 
{ 
    void Save(...); 
} 

class WorkbookWrapper : IWorkbook 
{ 
    private _workbook; 

    public WorkbookWrapper(...) 
    { 
     _workbook = new Workbook(...); 
    } 

    public void Save(...) 
    { 
     _workbook.Save(...); 
    } 
} 

然後改變你的代碼,以一個IWorkbook代替:

private Workbook _workbook; 

public FileFormatLookup(IWorkbook workbook, MemoryStream memoryStream) 
{ 
    _workbook = workbook; 
    _memoryStream = memoryStream; 
    Add(); 
} 

然後,您可以使用其他類,如相同的技術MemoryStream

+0

此類Aspose.Cells.Workbook的接口不存在,並且Save方法也不是虛擬的。那麼我有沒有辦法測試電話? –

+0

我用一個常用模式更新了我的答案,用於測試不受您控制的代碼,這應該允許您測試您的代碼。 –

相關問題