2010-07-27 85 views
0

所以我想在我的Web项目中测试我的一个函数,但它实际上并没有连接到项目中的任何东西(其他人正在处理该部分)。函数接受一个“ID”字段,关闭并执行一些查询并获取一些数据,对其执行一些计算,然后将一堆行写入FileStream并返回该流。我几乎只想通过将文件写入本地计算机并在函数完成后使用该文件目录来测试它。MVC项目中的测试功能

所以我的问题主要是:

1)我如何调用该函数只是为了测试目的,所以我可以测试所有的查询/计算/文件写入等而不会被连接到应用程序的其它部分只是还没有。

2)如何更改FileStream的'Return fs'以在本地写入我自己的计算机以查看已写入的文件。

谢谢你们!

回答

0

为了让您的功能可测试,你需要将所有的依赖隔离,并与存根嘲笑你的测试替换它们。你可以通过围绕文件系统类来实现这一点,并确保你的数据层类具有接口。有了这个代码可能看起来像:

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

} 

有了这个,你可以写(使用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); 


} 
0

您需要阅读单元测试,因为这样可以在很多方面解决您的问题 - 它还会向您介绍依赖注入和嘲笑,这将是处理您的问题的好方法。

这里是一个概述...

设置您的类,以便它接受在构造函数中的数据访问和文件作家。然后,您可以传递数据访问和文件写入器的模拟或存根版本,因此您不需要连接到数据库或写入文件系统来测试代码。

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

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

然后,您可以单独测试您的班级。

依赖注入:

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

起订量

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