RestSharp 110.2.0单元测试:ExecuteAsync返回Data为Null问题
RestSharp 110.2.0 单元测试中 response.Data 为空的问题
业务代码
我有一个使用RestSharp 110.2.0的GetToken方法,代码如下:
private IRestClient _restClient; public async Task<string> GetToken() { var pw = await _vault.GetValue("pw"); var un = await _vault.GetValue("un"); var request = new RestRequest(new Uri("login")); request.AddJsonBody(new { Username = un, Password = pw }); var response = await _restClient.ExecutePostAsync<string>(request); return response.Data; }
初始单元测试代码
我编写的单元测试代码如下:
private AutoMocker _mocker; [Fact] public async Task SomeTest() { _mocker.GetMock<IRestClient>() .Setup(m => m.ExecuteAsync(It.Is<RestRequest>(r => r.Resource == "login"), It.IsAny<CancellationToken>())) .ReturnsAsync(new RestResponse { StatusCode = HttpStatusCode.OK, ResponseStatus = ResponseStatus.Completed, IsSuccessStatusCode = true, Content = "authToken", }); var result = await _uut.GetToken(); Assert.Equal("authToken", result); }
问题排查与尝试的解决步骤
- 空引用异常解决:运行初始测试时出现空引用异常,通过模拟
IRestClient的Serializers属性解决了该问题,修改后的测试片段如下:
[Fact] public async Task SomeTest() { var serializerConfig = new SerializerConfig(); serializerConfig.UseDefaultSerializers(); _mocker.GetMock<IRestClient>() .Setup(m => m.Serializers) .Returns(new RestSerializers(serializerConfig)); // 其余测试代码保持不变 }
- response.Data 为空的问题:空引用问题解决后,发现
response.Data始终为null,虽然Content字段能看到预期的"authToken"值,但Data字段始终没有值。我尝试了以下方案均无效:- 直接构造泛型
RestResponse<string>并手动设置Data属性:.ReturnsAsync(new RestResponse<string>(new RestRequest()) { StatusCode = HttpStatusCode.OK, ResponseStatus = ResponseStatus.Completed, IsSuccessStatusCode = true, Content = "authToken", Data = "authToken" }); - 在响应中添加
ContentType = "application/json; charset=utf-8"配置
- 直接构造泛型
当前困境
我了解RestSharp官方文档中推荐的单元测试方案,但该方案目前对我来说不切实际,需要找到其他可行的解决办法。
内容的提问来源于stack exchange,提问作者gilliduck
相关产品推荐
相关产品推荐

