【发布时间】:2019-07-20 16:02:06
【问题描述】:
我有一个非常简单的 ASP.NET Core 项目。这是我的控制器:
public class AdminController : Controller
{
private readonly IProductRepository _repository;
public AdminController(IProductRepository repository)
{
_repository = repository;
}
public ViewResult Index()
{
return View(_repository.Products.OrderBy(p => p.Id));
}
public ViewResult Edit(int id)
{
Product product = _repository.Products.FirstOrDefault(p => p.Id == id);
return View(product);
}
[HttpPost]
public ActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
_repository.SaveProduct(product);
TempData["message"] = $"{product.Name} has been saved";
return RedirectToAction("Index");
}
return View(product);
}
}
我的看法_AdminLayout.cshtml
<main role="main" class="pb-3">
<div>
@if (TempData["message"] != null)
{
<div class="alert alert-success">
@TempData["message"]
</div>
}
</div>
@RenderBody()
</main>
最后是Index.cshtml 视图
@model System.Collections.Generic.IEnumerable<Domains.Entities.Product>
@{
ViewBag.Title = "Admin";
Layout = "_AdminLayout";
}
<div>
// some cshtml code ...
</div>
如您所见,我正在等待以下业务逻辑:
保存产品;
重定向到
Index.cs管理员视图我在屏幕顶部看到有关成功保存产品的消息。
但是什么也没发生。保存后看不到消息,重定向到Index 后TempData 为空。
此外,我对这种方法的单元测试有疑问。
这是我的测试代码:
[Test]
public void Can_Save_Valid_Changes()
{
Mock<IProductRepository> mock = new Mock<IProductRepository>();
AdminController controller = new AdminController(mock.Object);
Product product = new Product { Name = "Test"};
IActionResult result = controller.Edit(product);
// check if have saved product to repo
mock.Verify(m => m.SaveProduct(product));
Assert.IsNotInstanceOf<ViewResult>(result);
}
我使用NUnit 库进行测试。运行测试后,我收到来自测试的以下消息:object reference not set to an instance of an object。似乎将价值赋予TempData 在测试期间会引发此异常。
请告诉我,这个TempData 发生了什么?错误在哪里?我看到了很多关于TempData 奇怪行为的问题,但我没有找到适合我的答案。我很感激任何帮助。
【问题讨论】:
标签: c# asp.net-core nunit tempdata