如何对 Refit ApiResponse<T> 进行单元测试?

How to unit test the Refit ApiResponse<T>?

我正在使用 refit 来调用 API,响应包含在 ApiResonse<T> 中。我可以模拟 returns 模拟 ApiResponse<T> 的改装调用并断言。一切正常,除了我不确定如何测试 api 调用 returns 异常。

[Get("/customer/{id}")]
Task<ApiResponse<Customer>> GetCustomer(int id);

好像是用了ApiResponse<T> Refit 把request里面发生的所有exceptions都包装成ApiException,附加到ApiResponse<T>。如果使用 Task<T>,则捕获 ApiException 是调用者的责任。

我用 ApiException.Create() 创建了 ApiException,但不确定将它放在 ApiResponse<T> 的什么位置。 Create() 方法的最后一个参数是 ApiException,但我创建和设置的异常根本没有出现在 ApiResponse 中,因此无法测试。

var apiResponse = new ApiResponse<Customer>(
    new HttpResponseMessage(BadRequest),
    null,
    null,
    await ApiException.Create(,,,Exception("Something bad happened inside the api")
 );

我无法在单元测试中收到 Something bad happened... 消息,只能收到 'Bad Request' 消息。我在改装中对 ApiResponse 进行单元测试吗?任何帮助是极大的赞赏。谢谢

我不知道 Refit,但根据他们的文档,我希望有以下两个选项:

Return ApiResponse<Customer>

让我们看一下您的代码(顺便说一下,这不是正确的 C# - 请提供正确工作的代码):

var apiResponse = new ApiResponse<Customer>(
    new HttpResponseMessage(BadRequest),
    null,
    null,
    await ApiException.Create(,,,Exception("Something bad happened inside the api")
 );

执行此代码时,Refit 会被指示 return 正是您所要求的:return HTTP 500 具有以下内部异常 .

所以我希望您会发现 apiResponse.Error 中的 api 中发生了一些不好的事情,但不会抛出任何异常。

投掷ApiException

由于 ApiException 派生自 System.Exception,您可以替换此

var apiResponse = new ApiResponse<Customer>(
    new HttpResponseMessage(BadRequest),
    null,
    null,
    await ApiException.Create(,,,Exception("Something bad happened inside the api")
 );

来自

throw await ApiException.Create("Something bad happened inside the api", message, method, response, settings);

现在您可以在单元测试中捕获异常。