2012-10-06 120 views
-1

它已經研究過它,並發現了幾個有趣的鏈接like this但對我的問題,他們沒有幫助我。模擬擴展方法作爲接口

代碼

我有以下接口

public interface IViewFolderReference 
{ 
    string FolderName { get; set; } 
} 

擴展

public static ICollection<TFile> GetFiles<TFile>(this IViewFolderReference view) 
    where TFile: class, IFile 
{ 
    var folder = view.GetFolder(); 
    return folder.Exists ? 
     Mapper.Map<ICollection<TFile>>(folder.GetFiles()) 
     : null; 
} 

水泥混凝土類

public class ProcessoViewModel : IViewFolderReference 
{ 
    public string FolderName { get; set; } 
    public ICollection<File> Arquivos { get; set; }  
    ... 
} 

試驗方法

[TestMethod] 
public void Ao_salvar_processo_adicionar_dois_itens() 
{ 
    // Arrange 
    var vm = new Mock<ProcessoViewModel>(); 
    vm.Object.Arquivos = new List<File>() { 
     new File { FileName = "Arquivo 1.jpg", DisplayName = "Arquivo 1" } 
     ,new File { FileName = "Arquivo 2.doc", DisplayName = "Arquivo 2" } 
    }; 

    //Act 
    controller.salvar(vm.Object); // Problem here!! (GetFiles is called, How can mock the result??) 

    //Assert 
    var processoDb = repositorio.Query<Processo>().SingleOrDefault(p => p.Imovel == vm.Object.Imovel && vm.Object.DataEntrada == p.DataEntrada); 
    Assert.IsNotNull(processoDb.Arquivos); 
    Assert.AreEqual(processoDb.Arquivos.Count, 2); 
} 
+2

你的問題是什麼? – Sklivvz

+0

查看測試方法 - >> //問題在這裏! (GetFiles被調用,如何模擬結果??) – ridermansb

回答

2

如果您使用的是VS 2010,則可以使用Moles來模擬擴展方法(因爲它們只是使用此參數的第一個參數的靜態方法)。一個例子是here。在VS 2012中,您可以使用Microsoft Fakes

+0

我不知道痣,我會研究它。 它與Moq有相同的目標嗎? – ridermansb

+0

不完全。 Moq旨在用作設置虛擬/抽象方法模擬的簡單方法。鼴鼠走得更遠,讓你可以嘲笑靜態類,方法和其他一些很酷的東西。 –

+0

微軟在VS2012旗艦版上的價值僅爲可用...但其解決方案謝謝。 – ridermansb

0

它看起來像你真正需要的嘲笑是view.GetFolder()用合適的界面,可以讓你嘲笑folder.GetFiles()。這樣,擴展方法GetFiles被執行,但最終被基礎接口實現嘲弄。這與嘲笑應該如何工作是一致的。如果您已經對GetFiles擴展方法進行了測試,則在測試其他內容時調用它沒有任何壞處。

+0

'GetFolder'方法訪問'ConfigurationManager.AppSettings [keyAppConfig +'文件夾']'並使用'DirectoryInfo'類創建目錄。 **我希望它沒有。** 嘗試訪問方法'GetFolder'中的web.config('ConfigurationManager.AppSettings [keyAppConfig +「文件夾」'''''')時發生錯誤 – ridermansb