2
  • 我创建了一个简单的 Asp.net MVC 4 应用程序
  • 我使用 visula studio 2010 扩展创建了 NUnit 测试项目
  • 我添加了几个控制器(带有模型和视图)并且网站运行良好。它适用于 Sql Server CE

现在我需要测试一个控制器。我写了这个简单的类:

namespace SkateboardShop.Tests.Controllers
{
    [TestFixture]
    class BrandControllerTest
    {

        [Test]
        public void TestDetailsView()
        {

            var controller = new BrandController();
            var result = controller.Details(2) as ViewResult;
            Assert.AreEqual("Details", result.ViewName);

        }

    }
}

当我运行此测试时,NUnit 会返回此错误:

SkateboardShop.Tests.Controllers.BrandControllerTest.TestDetailsView: System.Data.ProviderIncompatibleException:从数据库获取提供者信息时出错。这可能是由 Entity Framework 使用不正确的连接字符串引起的。检查内部异常以获取详细信息并确保连接字符串正确。----> System.Data.ProviderIncompatibleException :提供程序未返回 ProviderManifestToken 字符串。----> System.Data.SqlClient.SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:SQL 网络接口,错误:

当然,测试项目从哪里获取数据提供者信息?我将连接字符串添加到 app.config 文件(测试项目的)中,如下所示:

<connectionStrings>
    <add name="SkateboardEntities" connectionString="Data Source=d:\Basic\project\asp\SkateboardShop\SkateboardShop\App_Data\SkateboardShop.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>

但无事可做。由于我是 MVC 和 NUnit 的新手,所以我首先要问的是,单元测试是否应该测试真实的数据库数据,以及它是否是一个好方法,如何做到这一点。

谢谢。

4

1 回答 1

0

在我看来 - 你应该有一个模拟存储库/持久层进行测试。以这种方式 - 你可以有一个可预测的结果集来处理和编写测试。

这方面的一个示例可能是您的控制器接受具有以下代码的存储库实例:

public class BrandController{
 public BrandController(IBrandRepository repository){...}
}

您可以使用任何 DI + Mock 框架来注入 IbrandRepository 进行单元测试

但是,在某些情况下,模拟是不够的,您确实需要一个物理数据库进行测试。

在这种情况下,我建议使用具有相同结构的测试数据库,但测试数据可以根据单元测试的需要重新播种/初始化。

在这种情况下,您可以将配置文件指向测试数据库进行测试和某种脚本或 DbInitializer 将数据库初始化回原始状态等。

HTH。

于 2012-04-27T16:01:46.103 回答