代码之家  ›  专栏  ›  技术社区  ›  Scott

MVC项目中的测试功能

  •  0
  • Scott  · 技术社区  · 14 年前

    所以我的问题主要是:

    1) 我如何调用这个函数只是为了测试,这样我就可以测试所有的查询/计算/文件写入等,而不必将它连接到应用程序的另一部分。

    谢谢你们!

    2 回复  |  直到 14 年前
        1
  •  0
  •   Matthew Manela    14 年前

    为了使您的函数可测试,您需要隔离所有依赖项,并在测试中用stubs mock替换它们。可以通过包装文件系统类并确保数据层类具有接口来实现这一点。使用此选项,您的代码可以如下所示:

    public class Something 
    {
      IDataProvider provider;
      IFileSystem fileSystem;
      public Something(IDataProvider provider,  IFileSystem fileSystem) 
      {
         this.provider = provider;
         this.fileSystem = fileSystem;
      }
    
       void DoThing(int id) 
       {
            // make database call to get data
            var data = provider.GetData(id);
    
            fileSystem.Write("someFilePath",data);
       }
    
    }
    

    有了它,您就可以编写这样的测试(在这个case中使用 Moq 类似语法):

    void SomeTest() 
    {
      var mockDataProvider = new Mock<IDataProvider>();
      var mockFileSystem = new Mock<IFileSystem>();
      var something = new Something(mockDataProvider.Object, mockFileSystem.Object);
      var data = "someData";
      mockDataProvider.Setup(x => x.GetData(5)).Return(data);
    
      DoThing(5);
    
      mockFileSystem.Verify(x => x.Write("someFilePath",data);
    
    
    }
    
        2
  •  0
  •   Fenton    14 年前

    您需要阅读单元测试的相关知识,因为它可以用很多方法解决您的问题—它还将向您介绍依赖注入和模拟,这将是处理您的问题的一个很好的方法。

    这里是一个概述。。。

    设置类,使其接受构造函数中的数据访问和文件编写器。然后可以传入模拟或存根版本的数据访问和文件编写器,这样就不需要连接到数据库或写入文件系统来测试代码。

    在“真实世界”中,您将传递真正的数据访问和文件编写器。

    在“测试世界”中,您使用MOQ或Rhino Mocks之类的工具来创建数据访问的假装版本,这意味着您可以预测每次测试时数据访问将返回的内容,因为它不是真实的数据库,而是您准备的一些数据。您还可以创建一个假装的文件编写器,实际上不需要编写真正的文件。

    依赖注入:

    http://msdn.microsoft.com/en-us/magazine/cc163739.aspx

    最小起订量

    http://code.google.com/p/moq/