-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模拟扩展方法(因为它们只是使用 this 的第一个参数的静态方法)。这里有一个例子。在 VS 2012 中,您可以使用Microsoft Fakes

于 2012-10-06T16:45:04.377 回答
0

看起来你真正需要模拟的是view.GetFolder()一个合适的接口,可以让你模拟folder.GetFiles()。这样扩展方法 GetFiles 被执行,但最终被底层接口实现模拟。这与模拟应该如何工作是一致的。如果您已经对 GetFiles 扩展方法进行了测试,那么在测试其他内容时调用它并没有什么坏处。

于 2012-10-06T15:29:26.447 回答