gpt4 book ai didi

c# - Mvc 5 单元测试 - 设置 Controller 的 viewbag 值

转载 作者:行者123 更新时间:2023-11-30 16:44:31 25 4
gpt4 key购买 nike

我有一个索引页,它可能有一个 ViewBag 值是上次搜索的值。我想设置我的 Controller ,以便我能够在调用我的被测系统 (ProductManagementController)

之前设置此 ViewBag

索引操作

[HttpPost]
public async Task<ActionResult> Index(ProductManagementVm postedVm)
{
// Reset pagination if new search
if (postedVm.BookSearch != ViewBag.lastSearch)
{
postedVm.Page = 1;
}

var httpResponseMessage = await_httpService.GetAsync(_urlConfigurations.GetProductList);

var vm = _productFactory.BuildProductManagementVm(
await Task.Run(() => httpResponseMessage.Content.ReadAsStringAsync()), postedVm);


vm.BookSearch = postedVm.BookSearch;

if (string.IsNullOrEmpty(postedVm.BookSearch))
{
postedVm.BookSearch = string.Empty;
}

ViewBag.lastSearch = postedVm.BookSearch;
return View(vm);
}

设置类

using System.ComponentModel.DataAnnotations;
using System.Net.Http;
using System.Web.Mvc;
using ICEBookshop.MVC.App.Controllers;
using ICEBookshop.MVC.App.Interfaces;
using ICEBookshop.MVC.App.Interfaces.Factories;
using ICEBookshop.MVC.App.Models;
using ICEBookshop.MVC.App.Models.ViewModels;
using Moq;
using SpecsFor;

namespace ICEBookshop.MVC.App.Tests.Controllers.ProductManagement
{
public class BaseGiven : SpecsFor<ProductManagementController>
{
protected Mock<IHttpService> HttpServiceMock = new Mock<IHttpService>();
protected Mock<IProductFactory> ProductFactoryMock = new Mock<IProductFactory>();
protected Mock<IUrlConfigurations> UrlConfigurationsMock = new Mock<IUrlConfigurations>();
protected Mock<IJsonValidator> JsonValidatorMock = new Mock<IJsonValidator>();
protected ProductManagementController ProductManagementController;
protected HttpResponseMessage HttpResponseMessage;
protected string JsonContent;
protected bool IsModelStateValid;

protected ActionResult ActionResult;
protected RedirectToRouteResult RedirectToRouteResult;
protected ViewResult ViewResult;
protected ProductManagementVm ProductManagementVm;
protected ProductViewModel ProductViewModel;

protected void BaseGivenSetup()
{
ProductManagementController = new ProductManagementController(HttpServiceMock.Object,
ProductFactoryMock.Object, UrlConfigurationsMock.Object, JsonValidatorMock.Object);

SUT = ProductManagementController;
}
}
}

我想设置 ProductManagementController.ViewBag.SomeName = "some string" 所以当我进入 Controller 时我会测试该场景,但目前它是 null

有谁知道如何在测试之前设置 Controller 的 ViewBag 值?

单元测试

public class WhenServiceReturnProductsAndViewBagHasSearchString : GivenGoingToIndexActionInProductsManagement
{
protected override void When()
{
HttpResponseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("some string content from the service")
};

HttpServiceMock.Setup(expr => expr.GetAsync(It.IsAny<string>())).ReturnsAsync(HttpResponseMessage);

ProductFactoryMock.Setup(
expr => expr.BuildProductManagementVm(It.IsAny<string>(), It.IsAny<ProductManagementVm>()))
.Returns(new ProductManagementVm());

// This doesn't work :(
SUT.ViewBag.LastSearch = "Hey I'm a search string :D";

BaseGivenSetup();

ActionResult = SUT.Index(new ProductManagementVm()).Result;
ViewResult = (ViewResult)ActionResult;
ProductManagementVm = (ProductManagementVm)ViewResult.Model;
}

[Test]
public void ThenActionResultIsNotNull()
{
Assert.IsNotNull(ActionResult);
}

[Test]
public void ThenAViewResultIsNotNull()
{
Assert.IsNotNull(ViewResult);
}

[Test]
public void ThenProductManagementVmIsNotNull()
{
Assert.IsNotNull(ProductManagementVm);
}
}

最佳答案

ViewBagViewData 属性获取数据

public dynamic ViewBag
{
get
{
if (_dynamicViewDataDictionary == null)
{
_dynamicViewDataDictionary = new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewDataDictionary;
}
}

所以你需要填充你想要的值,以便在 ViewBag

中访问它

这是一个POC

[TestClass]
public class ViewBagTests {
[TestMethod]
public void ViewBag_ShouldBe_PrePopulated() {
//Arrange
var SUT = new TargetController();

var expected = "Hey I'm the old search string :D";

SUT.ViewData["LastSearch"] = expected;

//Act
var actual = SUT.Index() as ViewResult;

//Assert
Assert.AreEqual(expected, actual.Model);
}

class TargetController : Controller {
public ActionResult Index() {
var previous = ViewBag.LastSearch;
return View((object)previous);
}
}

}

关于c# - Mvc 5 单元测试 - 设置 Controller 的 viewbag 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com