【问题标题】:Mocking a TempData in ASP.NET Core in MSTest在 MSTest 中模拟 ASP.NET Core 中的 TempData
【发布时间】:2019-02-10 09:37:00
【问题描述】:
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");           
}

它会抛出一个错误,例如,

结果堆栈跟踪:

在 Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(Expression setup, MethodInfo 方法)在 C:\projects\moq4\Source\Mock.cs:line 883 在 Moq.Mock.SetupGetPexProtected[T,TProperty](Mock1 mock, Expression1 表达式,条件条件)中 C:\projects\moq4\Source\Mock.cs:第 537 行 Moq.Mock.SetupGet[T,TProperty](Mock1 mock, Expression1 表达式, 条件条件)在 C:\projects\moq4\Source\Mock.cs:line 517 at Moq.Mock.SetupPexProtected[T,TResult](Mock1 mock, Expression1 表达式,条件条件)在 C:\projects\moq4\Source\Mock.cs:第 507 行 Moq.Mock.Setup[T,TResult](Mock1 mock, Expression1 表达式, 条件条件)在 C:\projects\moq4\Source\Mock.cs:line 484 at Moq.QueryableMockExtensions.FluentMock[T,TResult](Mock1 mock, Expression1 setup) 在 C:\projects\moq4\Source\Linq\Mocks.cs:line 224 在 lambda_method(Closure) 在 Moq.Mock.GetTargetMock(Expression fluentExpression, Mock mock) 在 C:\projects\moq4\Source\Mock.cs:line 856 在 Moq.Mock.SetupPexProtected[T,TResult](Mock1 mock, Expression1 表达式,条件条件)中 C:\projects\moq4\Source\Mock.cs:第 505 行 Moq.Mock.Setup[T,TResult](Mock1 mock, Expression1 表达式, 条件条件)在 C:\projects\moq4\Source\Mock.cs:line 484 at SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements() 在

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

结果消息:测试方法 SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements 抛出异常:System.NotSupportedException:在 非虚拟(在 VB 中可覆盖)成员:mock => mock.TempData

【问题讨论】:

  • 你可以查看这个 url 我们如何模拟临时数据weblogs.asp.net/leftslipper/…
  • 我正在使用 .net 核心框架和 MStest 作为核心框架,给出的是 .net 4.7.1 框架。这对我来说不匹配。我检查一下。谢谢,请提供更多建议。@RakeshKumar

标签: c# unit-testing asp.net-core moq mstest


【解决方案1】:

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

【讨论】:

  • 非常感谢@Nkosi
  • 对于 NSubstitute 模拟库,该行将是 ` var tempData= new TempDataDictionary(httpContext, Substitute.For());`
  • 工作愉快。很好的答案。
  • TempDataDictionary 不包含接收 2 个参数的构造函数
  • @Toshihiko 您使用的是什么版本的框架?这个答案适用于 .net 核心版本,它确实有一个带有 2 个参数 source.dot.net/#Microsoft.AspNetCore.Mvc.ViewFeatures/… 的构造函数,而之前的版本 (aspnet-mvc-5.2) 没有 docs.microsoft.com/en-us/dotnet/api/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多