如何在测试ActionResult时定义Controller上下文

时间:2016-06-12 00:40:09

标签: c# asp.net-mvc unit-testing tdd xunit

我有一个ActionResult,它在EntityFramework和Epplus的MVC 5项目中一致地工作。单击View上的Action链接会触发此ActionResult,它会将所选模型发送到新的Excel文档。

我正在学习在Visual Studio 2013中对我的MVC代码进行单元测试(使用Nuget Xunit 包)并认为我从小做起,做了相当于hello world test的测试在ActionResult上声明ActionResult不为null。

此回复测试失败:"System.InvalidOperationException : No connection string named 'StudentContext' could be found in the application config file."

我理解错误消息的含义,但我的问题是如何在测试项目中正确定义Controller上下文。我是否遗漏了一些简单而明显的东西,比如定义一个上下文变量,或者我是否完全以错误的方式解决这个问题?

这是我用来测试ActionResult的代码块。

using StudentProject.Controllers;
using System.Web.Mvc;
using Xunit;

namespace StudentProject.Tests.Controllers
{
    public class StudentRosterControllerTest
    {
        [Fact]
        public void ExportToExcel_IsNotNull()
        {
            // Arrange
            StudentRostersController controller = new StudentRostersController();            
            ActionResult ExcelExport;

            // Act
            ExcelExport = controller.ExportToExcel();

            // Assert
            Assert.NotNull(ExcelExport);
        }
    }
}

这是我正在测试的代码。它是一个自动搭建的控制器,隐藏了自动生成的crud方法,并显示了单个测试方法。

using OfficeOpenXml;
using StudentProject.Models;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;

namespace StudentProject.Controllers
{
    public class StudentRostersController : Controller
    {
        private StudentContext db = new StudentContext();

        // Auto-scaffolded CRUD methods not shown

        // This ActionResult exports the StudentRoster model 
        // to a fresh Excel file.

        public ActionResult ExportToExcel()
        {
            IEnumerable<StudentRoster> query = db.StudentRosters.AsEnumerable();

            using (var excelFile = new ExcelPackage())
            {
                ExcelWorksheet worksheet =
                    excelFile.Workbook.Worksheets.Add("Sheet1");
                worksheet.Cells["A1"].LoadFromCollection(Collection: query, 
                    PrintHeaders: true);

                // Results in file downloaded to user's default 
                // "My Downloads" folder.
                return File(excelFile.GetAsByteArray(),
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",  
               "Export.xlsx");   
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

System.InvalidOperationException:没有名为的连接字符串   &#39; StudentContext&#39;可以在应用程序配置文件中找到。&#34;

确保Test项目的app.config文件具有适合您的EF的连接字符串设置。

测试项目app.config

<connectionStrings>
  <add name="StudentContext" connectionString="..." providerName="System.Data.EntityClient" />
</connectionStrings>
  

我如何在测试项目中正确定义Controller上下文

您的测试应该尝试复制运行时环境。提供测试SUT所需的最低限度。

namespace StudentProject.Tests.Controllers
{
    public class StudentRosterControllerTest
    {
        [Fact]
        public void ExportToExcel_IsNotNull()
        {
            // Arrange
            StudentRostersController controller = new StudentRostersController();
            controller.ControllerContext = new ControllerContext() {
                Controller = controller,
                //...other properties needed for test
            };

            // Act
            var actionResult = controller.ExportToExcel();

            // Assert
            Assert.NotNull(actionResult);
        }
    }
}

鉴于您正在连接到您的实际数据库,那么这将被视为更多的集成测试。

我建议抽象你的数据访问,以便你可以在单元测试中模拟它。