我正在尝试创建一个单元测试,以使用包含在使用 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; set; }
从那里开始,当您调用
server.httpclient.getasync...
时,中间件会将响应传递给下一个中间件进行处理。