我正在尝试创建一个单元测试,以使用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方法。
我错过了什么?我无法在网络上找到一个明确的例子来实现该测试。 有人可以一步一步地介绍如何测试该控制器吗?
由于
答案 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...
时,中间件会将响应传递给下一个中间件来处理。