使用最小起订量模拟具有约束的泛型方法

本文关键字:约束 泛型方法 模拟 | 更新日期: 2023-09-27 18:35:59

我正在尝试模拟类中的泛型方法。我是Moq的新手,无法找出嘲笑该方法的正确方法。

我的代码需要测试和模拟。

public class WebServicesManager
{
    public static void Function1<TClient>()
        where TClient : SoapHttpClientProtocol, new()
    {
       //code
    }
}

泛型方法Function1接受泛型类型,泛型类型继承自 SoapHttpClientProtocol ,这基本上是旧版 asmx Web 服务的代理。

为了测试上述方法,我试图模拟泛型类型参数TClient。但是我需要正确的方法来做到这一点,我尝试了以下代码,但我找不到正确的代码。

    [TestMethod]
    public void Function1Test()
    {
        var mockService = new Mock<SoapHttpClientProtocol>();
        WebServicesManager.Function1<????>();
    }

我想到的方法之一是使用继承自SoapHttpClientProtocolFakeClass,然后使用 Fake 类调用泛型方法。

另外,我

在这里阅读了其他答案,其中大多数建议使用接口,这是正确的,但就我而言,由于代理代码是自动生成的(客户端代理代码),所以我有限制我不能使用接口。

我是否可以模拟类SoapHttpClientProtocol并将其作为泛型参数传递?

使用最小起订量模拟具有约束的泛型方法

我想到的方法之一是使用继承自SoapHttpClientProtocol的FakeClass,然后使用Fake class调用泛型方法。

我是否可以模拟类 SoapHttpClientProtocol 并将其作为泛型参数传递?

是的,如果你把模拟包装在假类中。

public class FakeClient : SoapHttpClientProtocol
{
    public static Mock<SoapHttpClientProtocol> Mock { get; set; }
    public override object GetData() => Mock.Object.GetData();
    public override object SendData(object data) => Mock.Object.SendData(data);
}
[TestMethod]
public void Function1Test()
{
    FakeClient.Mock = new Mock<SoapHttpClientProtocol>();
    FakeClient.Mock.Setup(mock => mock.GetData()).Returns(...));
    FakeClient.Mock.Setup(mock => mock.SendData(It.IsAny<object>())).Callback(...));
    WebServicesManager.Function1<FakeClient>();
}