Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用IEnumerable结果正确地集成测试Web Api控制器?_C#_Asp.net_Asp.net Mvc_Linq - Fatal编程技术网

C# 如何使用IEnumerable结果正确地集成测试Web Api控制器?

C# 如何使用IEnumerable结果正确地集成测试Web Api控制器?,c#,asp.net,asp.net-mvc,linq,C#,Asp.net,Asp.net Mvc,Linq,最初的问题有点不正确,因为问题只发生在控制器测试期间 问题是,当IEnumerable在延迟执行期间可能引发异常时,如何正确测试返回IEnumerable的web api控制器 例如,我有这样的API端点: public class EntityController : ApiController { ... public IHttpActionResult Get() { return Ok(Session.Query<Entity>());

最初的问题有点不正确,因为问题只发生在控制器测试期间

问题是,当IEnumerable在延迟执行期间可能引发异常时,如何正确测试返回IEnumerable的web api控制器

例如,我有这样的API端点:

public class EntityController : ApiController
{
    ...
    public IHttpActionResult Get()
    {
        return Ok(Session.Query<Entity>());
    }
}
但是,如果将ToList置于控制器内部,则该测试将无法通过

public class EntityController : ApiController
{
    ...
    public IHttpActionResult Get()
    {
        return Ok(Session.Query<Entity>().ToList());
    }
}
公共类EntityController:ApicController
{
...
public IHttpActionResult Get()
{
返回Ok(Session.Query().ToList());
}
}

在我看来,您似乎希望创建集成测试来测试web api端点

您当前的测试不会影响媒体类型格式化程序或web api管道中可能出现问题的其他部分

我建议在测试项目中使用nuget包。这将允许您在内存中的web服务器中设置web api控制器以进行测试,该测试将覆盖更多的web api管道

根据您的代码片段判断,您的web api控制器不依赖于
System.web
,因此使用OWIN进行测试可能适合您的需要。当然,这将涵盖特定于IIS设置的任何内容或web api之外的IIS管道中的任何内容。但是,如果在控制器操作中不使用
ToList()
,它将捕获延迟执行
Linq查询时引发的异常

要使用Owin和Owin测试,您需要遵循以下步骤:

一,。将nuget包添加到包含要测试的web api控制器的web项目中

二,。将Owin启动类添加到该web项目:

我们将覆盖测试项目中的
配置
方法

三,。将nuget包添加到测试项目中

四,。将nuget包添加到测试项目中

五,。在测试项目中创建测试类:

公共类TestClass{
私有类TestStartup:Startup{
公共覆盖无效配置(IAppBuilder应用程序){
//在这里设置web api、IoC等吗
var config=新的HttpConfiguration();
config.maphttpAttribute路由();
//…等等
app.UseWebApi(配置);
}
}
[测试]
公共无效MyTest(){
//安排
使用(var server=TestServer.Create()){
//表演
var response=server.CreateRequest(“api/someroute/”).GetAsync().Result;
//核实
Assert.Equal(HttpStatusCode.InternalServerError,response.StatusCode);
}
}
}
确保
TestStartup
内部类派生自步骤2中在web项目中创建的
Startup
类,这将确保web api从web项目中获取控制器。还有其他方法,但这很简单,并且如果使用Owin,可以重用来自实际应用程序的初始化代码


六,。Profit

您是否在实际应用程序中使用OWIN?否,实际应用程序托管在IIS中,但在部署之前,所有控制器都已通过针对数据库的集成测试
public class EntityController : ApiController
{
    ...
    public IHttpActionResult Get()
    {
        return Ok(Session.Query<Entity>().ToList());
    }
}
public class Startup {
    public virtual void Configuration(IAppBuilder builder) {
        // if you want to move all your web api initialization 
        // and configuration to here then you can. 
        // Otherwise just leave this method empty
    }
}
public class TestClass {
    private class TestStartup : Startup {
        public override void Configuration(IAppBuilder app) {
            // do your web api, IoC, etc setup here
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            // ...etc
            app.UseWebApi(config);
        }
    }

    [Test]
    public void MyTest() {
        // arrange
        using (var server = TestServer.Create<TestStartup>()) {

            // act
            var response = server.CreateRequest("api/someroute/").GetAsync().Result;

            // verify
            Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
        }
    }
}