c# - C# 如何使用 Xunit 测试 Jetbrains RESTClient
问题描述
在我的代码中的某处,我执行以下代码来获取 uri 以便记录:
string uri = restClient.BuildUri(request).ToString();
我有一些单元测试因此而中断,所以我试图模拟这样做:
var restClientMock = new Mock<RestClient>();
restClientMock
.Setup(client => client.BuildUri(It.IsAny<IRestRequest>()))
.Returns(new Uri("http://localhost:8080/"))
.Verifiable();
但我收到:
Invalid setup on a non-virtual (overridable in VB) member: client => client.BuildUri(It.IsAny<IRestRequest>())
我是 Xunit 的新手,我不知道如何解决这个问题。
解决方案
错误信息是正确的。RestClient.BuildUri
是非虚拟成员。
/// <summary>
/// Assembles URL to call based on parameters, method and resource
/// </summary>
/// <param name="request">RestRequest to execute</param>
/// <returns>Assembled System.Uri</returns>
public Uri BuildUri(IRestRequest request)
{
DoBuildUriValidations(request);
var applied = GetUrlSegmentParamsValues(request);
string mergedUri = MergeBaseUrlAndResource(applied.Uri, applied.Resource);
string finalUri = ApplyQueryStringParamsValuesToUri(mergedUri, request);
return new Uri(finalUri);
}
Moq 无法模拟非虚拟/抽象成员。
您的类不应与实现问题/具体化紧密耦合,而应与抽象紧密耦合。
在这种情况下,您应该使用IRestClient
,这RestClient
是派生出来的。
这将允许正确配置测试
//...
var restClientMock = new Mock<IRestClient>();
restClientMock
.Setup(client => client.BuildUri(It.IsAny<IRestRequest>()))
.Returns(new Uri("http://localhost:8080/"))
.Verifiable();
//...
推荐阅读
- flutter - 颤振创建后的异常
- java - Swagger annotation traversing all tables in DB
- security - 如何检查是否启用了 Authenticated Origin Pulls?
- r - 使用 read_csv 为 R 中的列组指定数据类型
- angular - 在 ag-grid 中隐藏列名?
- r - 将 R 脚本的输出传递给 bash 脚本
- python - 求解具有条件的非线性方程组
- c# - MasterDetailPage 在呈现为 NavigationPage 时中断
- javascript - 如何在 POSTMAN - AUTOMATION 中将令牌值从一个集合传递到另一个集合 新人
- mysql - 运行 Sqoop 导入时无法加载 JDBC 驱动程序