繁体   English   中英

在MSTest中模拟ASP.NET Core中的TempData

[英]Mocking a TempData in ASP.NET Core in MSTest

public ActionResult View(string name)
{
    if (TempData["SessionVariable"] != null)
    {
        FileName = name;  
        return View();
    }
    else
    {  
        return RedirectToAction("index", "Home");
    }

}

测试方法

public void UseCaseView_CorrectRequirements()
{
    var mock = new Mock<Controller>();
    mock.Setup(p => p.TempData["SessionVariable"]).Returns("admin");
    Controller.View("SAMPLE.xml");           
}

会引发错误,例如

结果StackTrace:

在Moq.Mock.SetupGetPexProtected [T,TProperty]的C:\\ projects \\ moq4 \\ Source \\ Mock.cs:line 883处Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(表达式设置,MethodInfo方法)(T,TProperty](模拟1 mock, Expression 1表达式,条件条件)位于C:\\ projects \\ moq4 \\ Source的C:\\ projects \\ moq4 \\ Source \\ Mock.cs:Moq.Mock.SetupGet [T,TProperty]的第537行(模拟1 mock, Expression 1表达式,条件条件) \\ Mock.cs:位于Moq.Mock.SetupPexProtected [T,TResult]的第517行(模拟1 mock, Expression 1表达式,条件条件)位于C:\\ projects \\ moq4 \\ Source \\ Mock.cs:位于Moq.Mock的507行.Setup [T,TResult](模拟1 mock, Expression 1倍的表达,条件状态)在C:\\项目\\ moq4 \\源\\ Mock.cs:线484在Moq.QueryableMockExtensions.FluentMock [T,TResult](模拟1 mock, Expression 1设置)位于C:\\ projects \\ moq4 \\ Source中的C:\\ projects \\ moq4 \\ Source \\ Linq \\ Mocks.cs:Lambda_method(Closure)处的224行,位于Moq.Mock.GetTargetMock(Expression fluentExpression,Mock模拟)处\\ Mock.cs:Moq.Mock.SetupPexProt的856行 在Moq.Mock.Setup的C:\\ projects \\ moq4 \\ Source \\ Mock.cs:line 505处选中[T,TResult](模拟1 mock, Expression 1 mock, Expression 1表达式,条件条件)[T,TResult](模拟1 mock, Expression C:\\ projects \\ moq4 \\ Source \\ Mock.cs:第484行的SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements()中的1 mock, Expression 1表达式,条件条件)

D:\\ Public \\ SE_WEBAPP_TESTCASE \\ SE_WEBAPP \\ SE_WEBAPP.Tests \\ TestControllers \\ UsecaseControllerTests.cs:第23行

结果消息:测试方法SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements引发了异常:System.NotSupportedException:在非虚拟(在VB中可重写)成员上的无效设置:模拟=>模拟.TempData

在asp.net-core中, Controller.TempData是公共属性,因此您可以轻松访问它并设置所需的键/值

public void UseCaseView_CorrectRequirements() {
    // Arrange
    var httpContext = new DefaultHttpContext();
    var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
    tempData["SessionVariable"] = "admin";        
    var controller = new UsecaseController() {
        TempData = tempData
    };
    var expected = "SAMPLE.xml";

    //Act
    var view = controller.View(expected) as ViewResult;
    var actual = controller.FileName;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM