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

问题描述 投票:0回答:1

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

我错过了什么?我在网上找不到实施该测试的明确示例。 有人可以在这里一步一步地说明如何测试该控制器吗?

谢谢

unit-testing asp.net-mvc-5 owin
1个回答
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...
时,中间件会将响应传递给下一个中间件进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.