如何获取API响应状态码?C#+RestSharp+SpecFlow测试问题
解决RestSharp + SpecFlow获取API响应状态码的问题
我来帮你搞定这个问题!结合RestSharp和SpecFlow获取API响应状态码其实很简单,我给你拆解下步骤和常见坑点:
1. 先确认RestSharp版本(关键!)
RestSharp在v107版本做了不少API变更,所以分两种情况给你示例:
情况一:RestSharp v107+(最新稳定版,推荐使用)
发起请求后会得到RestResponse对象,直接就能访问它的StatusCode(状态码枚举)和StatusDescription(状态字符串)属性。结合SpecFlow的Step Definition示例如下:
using RestSharp; using TechTalk.SpecFlow; using Xunit; // 也可以用NUnit等其他断言库 [Binding] public class ApiTestSteps { // 用类字段在Step之间共享响应对象 private RestResponse _apiResponse; [When(@"我向接口 ""(.*)"" 发送GET请求")] public async Task WhenISendGetRequestToEndpoint(string endpoint) { var client = new RestClient("https://你的API基础地址.com"); var request = new RestRequest(endpoint); // 推荐用异步请求方式 _apiResponse = await client.ExecuteGetAsync(request); // 打印调试信息,看看能不能输出状态码 Console.WriteLine($"当前响应状态码: {(int)_apiResponse.StatusCode}"); Console.WriteLine($"当前响应状态描述: {_apiResponse.StatusDescription}"); } [Then(@"响应状态码应该是 (.*)")] public void ThenResponseStatusCodeShouldBe(int expectedCode) { // 断言状态码(把枚举转成int和预期值对比) Assert.Equal(expectedCode, (int)_apiResponse.StatusCode); // 如果要断言状态字符串,比如"OK" Assert.Equal("OK", _apiResponse.StatusDescription); } }
关键注意点:
- 要保证
_apiResponse对象在Step之间正确共享,别在每个Step里重新声明,不然会丢失数据 StatusCode是HttpStatusCode枚举类型,转成int就是我们熟悉的数字(比如200)StatusDescription就是对应的状态字符串(比如"OK"、"NotFound")
情况二:RestSharp v106及以下(旧版本)
如果还在使用旧版本,请求返回的是IRestResponse,属性访问逻辑类似,但发起请求的方法略有不同:
[When(@"我向接口 ""(.*)"" 发送GET请求")] public async Task WhenISendGetRequestToEndpoint(string endpoint) { var client = new RestClient("https://你的API基础地址.com"); var request = new RestRequest(endpoint, Method.GET); _apiResponse = await client.ExecuteTaskAsync(request); Console.WriteLine($"当前响应状态码: {(int)_apiResponse.StatusCode}"); Console.WriteLine($"当前响应状态描述: {_apiResponse.StatusDescription}"); }
常见排查点(如果还是拿不到状态码)
如果你的打印语句没输出预期内容,可以从这几个方向排查:
- 检查请求是否真的发送成功:加
try-catch捕获请求过程中的异常,看看是不是网络问题或者URL写错了 - 确认
_apiResponse没有被意外重置:比如是不是在某个Step里重新赋值了这个字段 - 查看响应的错误信息:可以打印
_apiResponse.ErrorMessage和_apiResponse.ErrorException,排查请求失败的具体原因
比如加一段错误排查的打印代码:
if (!_apiResponse.IsSuccessful) { Console.WriteLine($"请求失败原因: {_apiResponse.ErrorMessage}"); if (_apiResponse.ErrorException != null) { Console.WriteLine($"异常详情: {_apiResponse.ErrorException.Message}"); } }
按照这个思路调整代码,应该就能顺利获取到状态码和状态描述,然后用Assert做验证啦!
内容的提问来源于stack exchange,提问作者bobe_b
相关产品推荐
相关产品推荐

