2017-04-10 75 views
2

我有一個索引頁,它可能有一個ViewBag上次搜索的值。我想設置我的控制器,以便我能被測打電話給我的系統之前,設置這個ViewBag值(ProductManagementControllerMvc 5單元測試 - 設置控制器的視圖值

Index操作

[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",所以當我進入控制器時,我測試了這個場景,但目前它是null

有沒有人知道如何在測試之前設置一個控制器的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); 
    } 
} 
+0

這個問題解決了嗎? – Nkosi

回答

1

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); 
     } 
    } 

}