C# 如何模拟RestSharp AddDefaultHeader方法

C# 如何模拟RestSharp AddDefaultHeader方法,c#,unit-testing,moq,restsharp,C#,Unit Testing,Moq,Restsharp,我正在尝试使用RestSharp(版本106.6.9)对该方法进行单元测试: 如果我的方法包含对.AddDefaultHeader的调用,那么我似乎无法测试该方法。我考虑创建自己的模拟对象,但IRestClient接口需要几十种方法 关于如何测试我的方法有什么建议吗?如果您想检查是否添加了默认标题,可以使用spy如下所示: [Fact] public void Test() { var mock = new Mock<IRestClient>(

我正在尝试使用RestSharp(版本106.6.9)对该方法进行单元测试:

如果我的方法包含对
.AddDefaultHeader
的调用,那么我似乎无法测试该方法。我考虑创建自己的模拟对象,但IRestClient接口需要几十种方法


关于如何测试我的方法有什么建议吗?

如果您想检查是否添加了默认标题,可以使用
spy
如下所示:

    [Fact]
    public void Test()
    {
        var mock = new Mock<IRestClient>();
        var spy = new List<Parameter>();
        mock
            .Setup(m => m.DefaultParameters.Add(It.IsAny<Parameter>()))
            .Callback((Parameter p) => spy.Add(p));
        var instance = mock.Object;

        instance.AddDefaultParameter(new Parameter("Foo", "Bar", ParameterType.Cookie));

        Assert.Equal("Bar", spy.Single().Value);
    }

本例使用
xUnit
作为测试运行程序,但其余部分应相同。

Moq不模拟扩展方法。弄清楚扩展方法访问什么,这就是您模拟的

该扩展方法的源可用,并最终调用

/// <summary>
/// Add a parameter to use on every request made with this client instance
/// </summary>
/// <param name="restClient">The IRestClient instance</param>
/// <param name="p">Parameter to add</param>
/// <returns></returns>
public static IRestClient AddDefaultParameter(this IRestClient restClient, Parameter p)
{
    if (p.Type == ParameterType.RequestBody)
    {
        throw new NotSupportedException(
            "Cannot set request body from default headers. Use Request.AddBody() instead.");
    }

    restClient.DefaultParameters.Add(p);

    return restClient;
}

Moq不模拟扩展方法。找出扩展方法访问的内容,以及您模拟的内容。根据当前显示的内容,应该可以在不模拟扩展调用的情况下执行该测试
System.NotSupportedException : Unsupported expression: m => m.AddDefaultHeader("Authorization", "Bearer Some expired token")
Extension methods (here: RestClientExtensions.AddDefaultHeader) may not be used in setup / verification expressions.
    [Fact]
    public void Test()
    {
        var mock = new Mock<IRestClient>();
        var spy = new List<Parameter>();
        mock
            .Setup(m => m.DefaultParameters.Add(It.IsAny<Parameter>()))
            .Callback((Parameter p) => spy.Add(p));
        var instance = mock.Object;

        instance.AddDefaultParameter(new Parameter("Foo", "Bar", ParameterType.Cookie));

        Assert.Equal("Bar", spy.Single().Value);
    }
restClient.DefaultParameters.Add(p);
/// <summary>
/// Add a parameter to use on every request made with this client instance
/// </summary>
/// <param name="restClient">The IRestClient instance</param>
/// <param name="p">Parameter to add</param>
/// <returns></returns>
public static IRestClient AddDefaultParameter(this IRestClient restClient, Parameter p)
{
    if (p.Type == ParameterType.RequestBody)
    {
        throw new NotSupportedException(
            "Cannot set request body from default headers. Use Request.AddBody() instead.");
    }

    restClient.DefaultParameters.Add(p);

    return restClient;
}
//...

mockRestClient.SetupAllProperties();

//...