C# 模拟扩展方法作为接口

C# 模拟扩展方法作为接口,c#,unit-testing,tdd,moq,mstest,C#,Unit Testing,Tdd,Moq,Mstest,它已经对此进行了研究,并发现了几个有趣的链接。 但对于我的问题,他们没有帮助我 密码 我有以下接口 延伸 混凝土类 试验方法 看起来您真正需要模拟的是view.GetFolder,它有一个合适的界面,可以让您模拟folder.GetFiles。这样就可以执行扩展方法GetFiles,但最终会被底层接口实现模拟。这与模拟的工作原理是一致的。如果您已经对GetFiles扩展名方法进行了测试,那么在测试其他方法时调用它是没有坏处的。如果您使用的是VS 2010,您可以使用模拟扩展名方法,因为它们只是静

它已经对此进行了研究,并发现了几个有趣的链接。 但对于我的问题,他们没有帮助我

密码 我有以下接口

延伸

混凝土类

试验方法


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

如果您使用的是VS 2010,您可以使用模拟扩展名方法,因为它们只是静态方法,第一个参数就是使用此方法。一个例子。在VS 2012中,您可以使用。

请参阅测试方法->>//这里有问题!!调用GetFiles时,如何模拟结果??GetFolder方法访问ConfigurationManager.AppSettings[keyAppConfig+Folder]并使用DirectoryInfo类创建目录。我希望它没有。尝试访问GetFolderI方法中的web.config ConfigurationManager.AppSettings[keyAppConfig+文件夹]时出错。我不知道Moles,我将研究它。它有相同的最低起订量目标?不完全是。Moq是一种为虚拟/抽象方法设置模拟的简单方法。Moles更进一步,允许您模拟静态类、方法和其他一些很酷的东西。Microsoft Fake仅在VS2012 Ultimate上可用。。。但这是解决办法,谢谢。
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);
}