首页 > 解决方案 > 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 的新手,我不知道如何解决这个问题。

标签: c#restmockingmoqxunit

解决方案


错误信息是正确的。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();

//...

推荐阅读