我有一个单元测试夹具,我正在尝试在ASP.NET MVC控制器上测试一个ControllerAction,该控制器用于Web应用程序上的成员函数.我正在尝试模拟测试的HttpContext.正在测试的ControllerAction实际上设置了HttpContext的属性,例如Session值,Response.Cookies值等.这不是所有代码,但这里是我试图运行的测试的粗略示例:
[Test]
public void ValidRegistrationDataSuccessfullyCreatesAndRegistersUser()
{
var context = new Mock<HttpContextBase>() {DefaultValue = DefaultValue.Mock};
context.SetupAllProperties();
var provider = new Mock<MembershipProvider>(new object[] {context.Object});
var controller = new AccountController(context.Object, provider.Object);
// This just sets up a local FormCollection object with valid user data
// in it to use to attempt the registration
InitializeValidFormData();
ActionResult result = controller.Register(_registrationData);
Assert.IsInstanceOfType(typeof(ViewResult), result);
// Here is where I'd like to attempt to do Assertions against properties
// of the HttpContext, like ensuring that a Session …
Run Code Online (Sandbox Code Playgroud) 在ASP.NET Core 1.0(MVC 6)项目中,我有一个Controller操作方法,我在其中使用该Response
属性来设置标头:
[HttpGet]
public IActionResult Get()
{
...
Response.Headers.Add("Location", location);
...
}
Run Code Online (Sandbox Code Playgroud)
我尝试为此操作方法实现单元测试,但该Response
属性的值为null.
这在以前的ASP.NET版本中很容易解决,因为该Response
属性具有setter,您可以HttpResponse
在单元测试期间将其值设置为新实例.
但是在ASP.NET 5 Response
中没有setter,只有一个getter.
如何Response
在单元测试中设置值?
更新:只是说清楚:这个问题是关于ASP.NET Core 1.0.另一个链接为重复的问题是关于ASP.NET 4,从那以后Api发生了变化,所以那里的答案不适用于这个问题.
如果我创建一个新的MVC 5项目(使用单元测试)并使用来自流行的SO答案的片段为我的控制器创建一个新的超类,则很容易将视图的内容呈现为字符串:
HomeController.cs
public class HomeController : StringableController
{
public ActionResult StringIndex()
{
string result = RenderRazorViewToString("Index", null);
return Content(result);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我访问/Home/StringIndex
,我会返回该视图的原始HTML.整洁(即使不是很有用)!但是在.Tests项目中,如果我尝试在单元测试中测试StringIndex()...
HomeControllerTest.cs
[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void StringIndex()
{
HomeController controller = new HomeController();
ContentResult result = controller.StringIndex() as ContentResult;
string resultString = result.Content;
Assert.IsTrue(resultString.Contains("Getting started"));
}
}
Run Code Online (Sandbox Code Playgroud)
......没有这样的运气.调用controller.StringIndex()
从单元测试创建ArgumentNullException
时System.Web.Mvc.ViewEngineCollection.FindPartialView()
被称为在上述的代码段,考虑的controllerContext
是null
.我已经尝试了几起订量为基础的办法(修改后的版本SetUpForTest()
和MvcMockHelpers
)嘲笑了controllerContext
,但是这可能是错误的做法,因为:1)这两种方法都不是专门针对Visual Studio中的单元测试,以及2)我不能完全肯定为了成功渲染视图,需要真实与模拟的内容.
在Visual …
asp.net-mvc unit-testing razor vs-unit-testing-framework visual-studio-2013