TempData 在我的 .NET Core 项目中不起作用

TempData does not work in my .NET Core project

我有非常简单的 ASP.NET 核心项目。这是我的控制器:

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>

如您所见,我正在等待以下业务逻辑:

  1. 保存一个产品;

  2. 重定向到 Index.cs 管理员视图

  3. 我在屏幕顶部看到有关成功保存产品的消息。

但是什么也没发生。保存后我没有看到消息,重定向到 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 的奇怪行为的问题,但我没有找到适合我的答案。我感谢任何帮助。

当对访问 TempData 的控制器进行单元测试时,您需要为控制器

创建一个 TempDataDictionary
[Test]
public void Can_Save_Valid_Changes() {
    //Arrange
    var httpContext = new DefaultHttpContext();
    var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
    var mock = new Mock<IProductRepository>();
    AdminController controller = new AdminController(mock.Object);
    controller.TempData = tempData;

    Product product = new Product { Name = "Test"};

    //Act
    IActionResult result = controller.Edit(product);

    //Assert
    // check if have saved product to repo 
    mock.Verify(m => m.SaveProduct(product));
    Assert.IsNotInstanceOf<ViewResult>(result);
    Assert.IsTrue(tempData.ContainsKey("message"));
}