使用NUnit进行ASP.NET MVC单元测试

7
我一直在尝试学习使用ASP.NET MVC,并观看了ASP.NET网站上的视频,但在进行单元测试时遇到了问题。
我有一个非常简单的控制器,它使用LINQ to SQL获取对象数组:
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        using (TrainingLogDataContext dc = new TrainingLogDataContext())
        {
            ViewData.Model = dc.Workouts.ToArray();
        }

        return View();
    }

NUnit中,此操作失败并显示以下错误:

at TrainingLog.Models.TrainingLogDataContext..ctor() in C:\Webs\TrainingLog\TrainingLog\Models\TrainingLog.designer.cs:line 41
at TrainingLog.Controllers.HomeController.Index() in C:\Webs\TrainingLog\TrainingLog\Controllers\HomeController.cs:line 16
at TrainingLogTests.Controllers.HomeControllerTest.Index() in C:\Webs\TrainingLog\TrainingLog.Tests\Controllers\HomeControllerTest.cs:line 23

我猜问题在于 NUnit 无法从 web.config 获取 DataContext 的连接字符串。有什么好的解决方法吗?
在运行页面时它可以正常工作,但是在 NUnit 中单元测试失败了。
5个回答

5

将您在 web.config 项目中的连接字符串复制到 nunit 测试项目中的 app.config 中。


3
我采取的方法是模拟数据上下文。我使用一个工厂创建数据上下文,并将其注入到控制器中。如果工厂为空(当调用无参构造函数时发生这种情况),它会创建一个连接到数据库的默认工厂实例。在我的单元测试中,我使用一个工厂创建一个工作在内存中的虚假数据上下文。我基于此博客的代码编写了我的模拟数据上下文,不过我扩展了它的功能以处理通过实体集添加到数据库中的对象。
如果你不想走模拟的路线(虽然我建议你这样做,但需要付出一些前期工作),你可以在单元测试项目中添加一个app.config文件,并将数据上下文的连接字符串放在其中。

1

1
最好不要从单元测试中访问数据库,因为这将导致测试运行得非常缓慢,以至于您将停止运行测试。但是,如果您确实想要这样做,可以在您的NUnit项目中创建一个app.config文件,并在其中放置连接字符串。有时NUnit无法识别此app.config文件,但有关如何配置它使其能够识别的更多详细信息可以在“如何在NUnit中初始化ConnectionStrings集合”的答案中找到。

0
最简单的方法是在安装ASP.NET MVC之前安装NUnit,然后在创建ASP.NET MVC项目时设置测试项目。然后,您可以创建必要的配置元素以执行您尝试的操作。
注意:更好的处理数据的方法是模拟它,这意味着您需要将LINQ从控制器中移出,因为您不能轻易地控制控制器的反转。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接