【发布时间】:2016-04-24 05:25:36
【问题描述】:
我正在尝试编写一个检查两个控制器操作的单元测试。这些控制器动作依赖于 Session 变量。到目前为止,我有这个:
单元测试:
[TestMethod]
public void TableOfContentReportTest()
{
// Arrange
var fakeDb = TestFakes.SetupFakeDbContext();
var controller = TestFakes.ProjectController(fakeDb);
// Act
var selectedSubs = AutoMapper.Mapper.Map<ProjectSubmissionViewModel>(fakeDb.ProjectSubmission.FirstOrDefault());
selectedSubs.Selected = true;
controller.Session["SelectedSubmissions"] = new List<ProjectSubmissionViewModel> {selectedSubs};
var result = controller.SubmissionIndex("ProjectTitle", true,1, 10,"","","","","",
StaticStrings.Report_TableOfContents) as ViewResult;
// Assert
Assert.IsNotNull(result);
var testSession = controller.processReport();
}
TestFakes.ProjectController 像这样为控制器设置会话:
//...
var session = new Mock<HttpSessionStateBase>();
var context = new Mock<HttpContextBase>(MockBehavior.Strict);
context.SetupGet(x => x.Session).Returns(session.Object);
var rc = new RequestContext(context.Object, new RouteData());
var controller = new ProjectController(fakeDb);
controller.ControllerContext = new ControllerContext(rc, controller);
//...
SubmissionIndex 设置 Session 变量:
public virtual ActionResult SubmissionIndex(
string sortBy = "ProjectTitle",
bool ascending = true,
int page = 1,
int pageSize = 10,
string projectId = "",
string submissiontitle = "",
string firstname = "",
string lastname = "",
string email = "",
string showreport = "")
{
var selectedSubmissions = Session["SelectedSubmissions"] as ICollection<ProjectSubmissionViewModel>;
//... Uses selectedSubmissions to build bookResources and chapters
Session["reportData"] = viewModel.GetContentsReport(bookResources, chapters);
//...
}
在运行时,代码有效。通过单元测试,SubmissionIndex 将 Session["SelectedSubmissions"] 视为 null。
我是否设置了假控制器的会话错误?测试时如何使用 Session?
更新:我经常从重定向调用 SubmissionIndex 操作:Session["SelectedSubmissions"] = model.Submissions.Where(s => s.Selected).ToList();
return RedirectToAction("SubmissionIndex", "Project", routeValues);
【问题讨论】:
-
当您可以将 List
作为参数传递给 SubmissionIndex 方法时,我仍然不明白为什么要使用会话...您是否在其他地方使用会话进行测试? -
是的,我是。我试图使示例尽可能简单且易于阅读。但是两个 Session 值(如上所示)都需要在其他地方访问。