微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在尝试创建一个单元测试,以使用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时…中间件会将响应传递给下一个中间件来处理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐