C# 如何获取API响应状态或状态代码
我正在学习c、VS,并结合RestSharp和SpecFlow尝试学习一些自动化的API测试,我正在尝试获取响应代码或响应状态,以便使用Assert语句验证这两者之一 我遇到的问题是,我似乎无法获得响应并将其显示为响应代码。i、 E200 或作为响应状态int字符串格式。i、 好的 我用print语句编写了以下代码,该语句应该打印响应代码,但当我运行代码时,输出中会打印一行空行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
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交互脚本中解决,然后将其集成到测试中。