C# 如何获取API响应状态或状态代码

C# 如何获取API响应状态或状态代码,c#,restsharp,specflow,C#,Restsharp,Specflow,我正在学习c、VS,并结合RestSharp和SpecFlow尝试学习一些自动化的API测试,我正在尝试获取响应代码或响应状态,以便使用Assert语句验证这两者之一 我遇到的问题是,我似乎无法获得响应并将其显示为响应代码。i、 E200 或作为响应状态int字符串格式。i、 好的 我用print语句编写了以下代码,该语句应该打印响应代码,但当我运行代码时,输出中会打印一行空行 using System; using System.Net; using TechTalk.SpecFlow; us

我正在学习c、VS,并结合RestSharp和SpecFlow尝试学习一些自动化的API测试,我正在尝试获取响应代码或响应状态,以便使用Assert语句验证这两者之一

我遇到的问题是,我似乎无法获得响应并将其显示为响应代码。i、 E200 或作为响应状态int字符串格式。i、 好的

我用print语句编写了以下代码,该语句应该打印响应代码,但当我运行代码时,输出中会打印一行空行

using System;
using System.Net;
using TechTalk.SpecFlow;
using RestSharp;
using NUnit.Framework;

namespace SWAPITEST.Steps
{
[Binding]
public class SWAPIFeaturesSteps : BaseSteps
{
    //private RestClient restClient;
    //private RestRequest restRequest;
   // private IRestResponse restResponse;

    [Given(@"i sen an api request for a luke skywalker")]
    public void GivenISenAnApiRequestForALukeSkywalker()
    {
     restRequest = new RestRequest(Method.GET);

    }

    [When(@"the response code is received")]
    public void WhenTheResponseCodeIsReceived()
    {
        restResponse = restClient.Execute(restRequest);
    }

    [Then(@"the Resonse code is OK")]
    public void ThenTheResonseCodeIsOK()
    {
        HttpStatusCode statusCode = restResponse.StatusCode;
        int numericStatusCode = (int)statusCode;
        Console.WriteLine(numericStatusCode);
    }
}
}
这将打印一个代码0,表示呼叫正在终止,但是如果我使用邮递员发送相同的呼叫,我将收到一个ok响应状态200

基本步骤类

谁能告诉我如何获得响应代码并在断言中使用它? 例如:

Assert.That(resp.ToString, Is.EqualTo(200));
Assert.That(resp.ToString, Is.EqualTo("OK"));
或者我如何能够断言响应的实际状态?例如:

Assert.That(resp.ToString, Is.EqualTo(200));
Assert.That(resp.ToString, Is.EqualTo("OK"));

我不使用RestSharp,但我认为您需要这样做才能创建一个知道在何处发出请求的请求:

[Given(@"i sen an api request for a luke skywalker")]
public void GivenISenAnApiRequestForALukeSkywalker()
{
 restRequest = new RestRequest(BaseUri.AbsoluteUri, Method.GET);

}

这是一个古老的线索,但这是一个答案,任何人都发现了这一点

你们的脚步彼此都不了解。响应是在When中设置的,但不会存储在任何位置,以便在尝试从中获取响应代码的位置使用。您可以将响应存储在场景上下文中,并在以后的步骤中将其撤回

储存 ScenarioContext.Current.Addresponse,response;其中第一个参数是关键,第二个是实际响应

找回它 var response=ScenarioContext.Current[response]

现在,如果您将响应代码强制转换为int,您将得到数字代码。 intresponse.STATUSSCODE,因为您的Then步骤中已填充响应

更新******2019年7月15日

场景上下文正在被逐步淘汰,取而代之的是上下文注入。为了获得相同的功能,我执行了以下操作: 创建了一个类,该类包含添加上下文项的词典。它是一种允许我插入几乎任何东西的类型

使用制度; 使用System.Collections.Generic; 命名空间CentralFramework.ScenarioContext { 公共类上下文 { 公共字典contextCollection=新字典; } } 然后在我想在其中使用它的任何类中添加以下内容:

公共类scenariohook//示例类 { 语境; public ScenarioHooksContextries上下文//在构造函数中新建实例 { this.context=上下文; } 要在上下文中存储某些内容,它与原始答案非常相似:

context.contextCollection.AddwebDriver,webDriver;//将webDriver添加到集合中,可以是任何内容。 要从集合中检索某些内容,请执行以下操作:

IWebDriver webDriver=IWebDrivercontext.contextCollection[webDriver]; 就像场景上下文一样,您需要确保在使用检索时设置类型,因为它只是存储为对象字符串、int等

要从集合中删除某些内容,请执行以下操作:

context.contextCollection.RemovewebDriver;
上面所有的例子都是处理字典的方法。没有什么特别的。这个解决方案工作得很好。它具有标准字典附带的所有验证功能,这也很好。

我觉得你没有创建有意义的请求。你有这个BaseUri,但你没有将它分配给任何东西。它看起来就像你的请求知道它是一个GET,但没有其他。你得到一个异常吗?我没有得到一个异常。测试运行,但我得到的打印输出为零。需要在哪里分配BaseUri?谢谢,我除了[Given@isen为卢克·天行者发出api请求]public void givenisenapirequestforalukeskywalker{restRequest=new RestRequestBaseUri,Method.GET;}但由于某些原因,两者都打印状态代码0在控制台应用程序或c交互脚本中解决,然后将其集成到测试中。