c# - 单元测试视图中设置的 ASP.NET MVC ViewBag 属性
问题描述
我有各种需要测试的 ViewBag 设置正确。我从测试一个简单的 ViewBag.Title 开始,然后我将转到其他实际传递动态数据的 ViewBags。
我正在尝试在 Create.cshtml 中测试这个 ViewBag.Title
@{
ViewBag.Title = "Create";
}
此视图的预订控制器:
// GET: Booking/Create
public ActionResult Create()
{
return View();
}
我尝试了以下方法:
[TestMethod]
public void BookingTest()
{
var controller = new BookingController();
var ar = controller.Create() as ViewResult;
Assert.AreEqual("Create", ar.ViewData["Title"]);
}
也试过:
[TestMethod]
public void BookingTest()
{
var controller = new BookingController();
//var ar = controller.Create() as ViewResult;
Assert.AreEqual("Create", controller.ViewBag.Title);
}
两个单元测试都失败并返回以下内容:Message: Assert.AreEqual failed. Expected:<Create>. Actual:<(null)>.
谁能看到我做错了什么?
解决方案
基于
@{
ViewBag.Title = "Create";
}
看来您是ViewBag
在实际的 View (即cshtml)文件中设置。
根据Controller
和View
的分离方式,单元测试将无法访问呈现的视图。(在这种情况下)将由框架在运行时执行,以便将必要的数据传递给视图ActionResult
。ViewResult
要获得预期的行为,您必须Title
从控制器分配它
控制器动作:
public ActionResult Create() {
ViewBag.Title = "Create";
return View();
}
让您的测试按预期运行。
[TestMethod]
public void BookingTest() {
//Arrange
var controller = new BookingController();
string expected = "Create";
//Act
var result = controller.Create() as ViewResult;
var actual = (string) result.ViewData["Title"];
//Assert
Assert.AreEqual(expected, actual);
}
推荐阅读
- java - org.springframework.beans.factory.CannotLoadBeanClassException:找不到 bean 的类 [com.mchange.v2.c3p0.ComboPooledDataSource]
- java - 从 JSON 数据中删除高级字段
- python - 使用列表理解检查两个不同列表中的两个项目是否具有相似的值
- javascript - 使用 javascript 创建动态多级 html 菜单
- kubernetes-ingress - Traefik 2.x IngressRoute 不适用于给定的 Web 应用程序上下文根
- javascript - 如何在 react-router-dom 中嵌套路由
- magento - 如何使用 minicart 结帐按钮的单击事件在 magento 2 中显示弹出显示
- generics - 如何在泛型中创建类型 T 的值
- c++ - 在添加队列后,我的生产者-消费者应用程序中的队列被指示为空。我该如何解决?
- apache-kafka - Kafka 属性 max.partition.fetch.bytes 返回不正确的数据大小