我正在尝试创建一个单元测试,以使用Framework 4.5.1在Visual Studio 2013中使用MVC 5的.NET模板项目中包含的控制器运行.
这是为了测试项目中包含的ManageController类以进行标准用户登录.
这是我用来调用控制器的Index操作的代码(请记住“Index”操作是默认操作):
[TestClass] public class ManageControllerTests { [TestMethod] public async Task ManageController_Index_ShoudlPass() { using (var server = TestServer.Create<Startup>()) { var response = await server.HttpClient.GetAsync("/Manage"); Assert.AreEqual(HttpStatusCode.OK,response.StatusCode); } } }
测试没有失败,但响应是404.
如果我尝试调试进程似乎没有在控制器或事件控制器构造函数中击中Index方法.
我通过NuGet添加了“Microsoft.Owin.Testing”包.并且正确调用应用程序的Startup类中的Configuration方法.
我错过了什么?我无法在网络上找到一个明确的例子来实现该测试.
有人可以在这里逐步介绍如何测试该控制器吗?
谢谢
解决方法
你不能这样做. OWIN管道旨在与任何托管环境分离运行.
MVC与system.web强烈耦合,这使得使用OWIN管道进行测试变得更加困难.
你可以做类似这样的事情:
[TestClass] public class ManageControllerTests { [TestMethod] public async Task ManageController_Index_ShoudlPass() { using (var server = CustomTestServer.Create<Startup>()) { server.OnNextMiddleware = context => { context.Response.StatusCode.ShouldBe(Convert.ToInt16(HttpStatusCode.OK)); return Task.FromResult(0); } var response = await server.HttpClient.GetAsync("/Manage"); } }
你需要派生
public class CustomTestServer : TestServer
appBuilder.Use(async (context,next) => { await OnNextMiddleware(context); });
和一个公共成员
public Func< IOwinContext,Task> OnNextMiddleware {get;组; }
从那里,当你调用server.httpclient.getasync时…中间件会将响应传递给下一个中间件来处理.