它已经对它进行了研究,发现了几个有趣的链接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);
}
答案 0 :(得分:2)
如果您使用的是VS 2010,则可以使用Moles来模拟扩展方法(因为它们只是使用第一个参数的静态方法)。一个例子here。在VS 2012中,您可以使用Microsoft Fakes。
答案 1 :(得分:0)
看起来你真正需要模拟的是view.GetFolder()
,其中有一个合适的界面可以模拟folder.GetFiles()
。这样,扩展方法GetFiles就会被执行,但最终会被底层接口实现模仿。这与模拟应该如何工作一致。如果您已经对GetFiles扩展方法进行了测试,那么在测试其他内容时调用它是没有害处的。