-1

それについてはすでに調査しており、このような興味深いリンクがいくつか見つかりました。 しかし、私の問題に関しては、彼らは私を助けてくれませんでした.

コード

私は次のインターフェースを持っています

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);
}
4

2 に答える 2

2

VS 2010 を使用している場合は、Molesを使用して拡張メソッドをモックできます (これは、これを使用する最初のパラメーターを持つ単純な静的メソッドであるため)。一例をここに。VS 2012 では、Microsoft Fakesを使用できます。

于 2012-10-06T16:45:04.377 に答える
0

本当にモックする必要があるのは、モックview.GetFolder()できる適切なインターフェイスを使用することですfolder.GetFiles()。このようにして、拡張メソッド GetFiles が実行されますが、最終的には基になるインターフェイスの実装によってモックされます。これは、モッキングがどのように機能するかと一致しています。GetFiles 拡張メソッドのテストが既にある場合は、他の何かのテスト中に呼び出しても害はありません。

于 2012-10-06T15:29:26.447 に答える