使用Owin为MVC 5控制器创建单元测试

时间:2014-09-17 16:27:30

标签: unit-testing asp.net-mvc-5 owin

我正在尝试创建一个单元测试,以使用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方法。

我错过了什么?我无法在网络上找到一个明确的例子来实现该测试。 有人可以一步一步地介绍如何测试该控制器吗?

由于

1 个答案:

答案 0 :(得分:2)

你做不到。 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; set; }

从那里,当你致电server.httpclient.getasync...时,中间件会将响应传递给下一个中间件来处理。