2009-04-25 134 views
7

我一直在尝试学习ASP.NET MVC使用发布在​​上的视频,我遇到了单元测试的问题。ASP.NET MVC单元测试与NUnit

我有一个使用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失败。

回答

3

我采取的方法是嘲笑数据上下文。我使用工厂来创建数据上下文并将其注入到控制器中。如果工厂为空(这是调用无参数构造函数时发生的情况),它将创建连接到数据库的工厂的默认实例。在我的单元测试中,我使用了一个工厂来创建一个在内存中工作的假数据上下文。我基于this blog的代码基于我的模拟数据上下文,尽管我已经扩展它来处理通过实体集添加到数据库中的对象。

如果你不想去模拟路线(我会推荐它,尽管它会采取一些预先工作)。您可以将一个app.config文件添加到您的单元测试项目中,并将数据上下文的连接字符串放入其中。

0

最简单的是你以前安装ASP.NET MVC安装NUnit的,然后建立测试项目,当您创建ASP.NET MVC项目。然后,您可以创建必要的配置元素来执行您正在尝试的操作。

注意:处理数据的更好方法是模拟它,这意味着您需要将LINQ移出控制器,因为您无法轻松地在控制器上反转控制。

5

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

+1

适合我,谢谢:) – melaos 2010-03-29 08:08:38

1

最好不要从你的单元测试中访问数据库,因为这会导致测试运行速度太慢,以至于你会停止运行测试。但是,如果你确实想要这样做,你可以在你的NUnit项目中创建一个app.config文件,并将你的连接字符串放在那里。有时NUnit不能识别这个app.config文件,但是关于如何配置它的更多细节可以在“How to initialize ConnectionStrings collection in NUnit”的答案中找到。