在 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");
}
它抛出一个错误,例如,
结果堆栈跟踪:
at Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(Expression
setup, MethodInfo method) in C:\projects\moq4\Source\Mock.cs:line 883
at Moq.Mock.SetupGetPexProtected[T,TProperty](Mock1 mock,
Expression
1 expression, Condition condition) in
C:\projects\moq4\Source\Mock.cs:line 537 at
Moq.Mock.SetupGet[T,TProperty](Mock1 mock, Expression
1 expression,
Condition condition) in C:\projects\moq4\Source\Mock.cs:line 517 at
Moq.Mock.SetupPexProtected[T,TResult](Mock1 mock, Expression
1
expression, Condition condition) in
C:\projects\moq4\Source\Mock.cs:line 507 at
Moq.Mock.Setup[T,TResult](Mock1 mock, Expression
1 expression,
Condition condition) in C:\projects\moq4\Source\Mock.cs:line 484 at
Moq.QueryableMockExtensions.FluentMock[T,TResult](Mock1 mock,
Expression
1 setup) in C:\projects\moq4\Source\Linq\Mocks.cs:line 224
at lambda_method(Closure ) at Moq.Mock.GetTargetMock(Expression
fluentExpression, Mock mock) in C:\projects\moq4\Source\Mock.cs:line
856 at Moq.Mock.SetupPexProtected[T,TResult](Mock1 mock,
Expression
1 expression, Condition condition) in
C:\projects\moq4\Source\Mock.cs:line 505 at
Moq.Mock.Setup[T,TResult](Mock1 mock, Expression
1 expression,
Condition condition) in C:\projects\moq4\Source\Mock.cs:line 484 at
SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements()
in
D:\Public\SE_WEBAPP_TESTCASE\SE_WEBAPP\SE_WEBAPP.Tests\TestControllers\UsecaseControllerTests.cs:line 23
结果信息:测试方法
SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements
抛出异常:System.NotSupportedException:a 上的设置无效
非虚拟(在 VB 中可覆盖)成员:mock => mock.TempData
在asp.net-core中,Controller.TempData
是一个public属性,所以你可以方便地访问它并设置想要的key/value
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);
}
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");
}
它抛出一个错误,例如,
结果堆栈跟踪:
at Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(Expression setup, MethodInfo method) in C:\projects\moq4\Source\Mock.cs:line 883 at Moq.Mock.SetupGetPexProtected[T,TProperty](Mock
1 mock, Expression
1 expression, Condition condition) in C:\projects\moq4\Source\Mock.cs:line 537 at Moq.Mock.SetupGet[T,TProperty](Mock1 mock, Expression
1 expression, Condition condition) in C:\projects\moq4\Source\Mock.cs:line 517 at Moq.Mock.SetupPexProtected[T,TResult](Mock1 mock, Expression
1 expression, Condition condition) in C:\projects\moq4\Source\Mock.cs:line 507 at Moq.Mock.Setup[T,TResult](Mock1 mock, Expression
1 expression, Condition condition) in C:\projects\moq4\Source\Mock.cs:line 484 at Moq.QueryableMockExtensions.FluentMock[T,TResult](Mock1 mock, Expression
1 setup) in C:\projects\moq4\Source\Linq\Mocks.cs:line 224 at lambda_method(Closure ) at Moq.Mock.GetTargetMock(Expression fluentExpression, Mock mock) in C:\projects\moq4\Source\Mock.cs:line 856 at Moq.Mock.SetupPexProtected[T,TResult](Mock1 mock, Expression
1 expression, Condition condition) in C:\projects\moq4\Source\Mock.cs:line 505 at Moq.Mock.Setup[T,TResult](Mock1 mock, Expression
1 expression, Condition condition) in C:\projects\moq4\Source\Mock.cs:line 484 at SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements() inD:\Public\SE_WEBAPP_TESTCASE\SE_WEBAPP\SE_WEBAPP.Tests\TestControllers\UsecaseControllerTests.cs:line 23
结果信息:测试方法 SE_WEBAPP.Tests.TestControllers.UsecaseControllerTests.UseCaseView_CorrectRequirements 抛出异常:System.NotSupportedException:a 上的设置无效 非虚拟(在 VB 中可覆盖)成员:mock => mock.TempData
在asp.net-core中,Controller.TempData
是一个public属性,所以你可以方便地访问它并设置想要的key/value
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);
}