最小起订量 + 单元测试 + System.Reflection.TargetParameterCountException:参数计数不匹配

Moq + Unit Testing + System.Reflection.TargetParameterCountException: Parameter Count mismatch

我在尝试模拟我们的 ApiClient 时收到 "System.Reflection.TargetParameterCountException: Parameter Count mismatch" 异常。

我正在使用以下代码设置最小起订量响应

private void SetupApiClientForGetZones(IEnumerable<Zone> zone)
{
    this.MockHubApiClient.Setup(x => x.GetAsync<IEnumerable<Zone>>(It.IsAny<string>(), It.IsAny<IDictionary<string, string>>()))
                .Returns(
                    (string name) =>
                    {
                        return zone == null ? Task.FromResult<IEnumerable<Zone>>(null) : Task.Run(() => zone);
                    });

            this.MockApiClientFactory.Setup(x => x.CreateClient(It.IsAny<string>()))
                .Returns(this.MockHubApiClient.Object);
        }

我尝试模拟的 iApiClient 接口是

public interface IApiClientAsync : IApiClient
    {
        Task<string> GetAsync(string apiController);

        Task<T> GetAsync<T>(string apiController) where T : class;

        Task<string> GetAsync(string apiController, IDictionary<string, string> param, string queryString);

        Task<T> GetAsync<T>(string apiController, IDictionary<string, string> param) where T : class;
}

我的单元测试是

[Test]
public void GetZonesNotCached()
{
    var data = new List<Zone> { new Zone { ZoneId = 1, ZoneName = "Test Zone 1" }, new Zone { ZoneId = 2, ZoneName = "Test Zone 2" } };

    this.SetupApiClientForGetZones(data);

    this.MockCache.Setup(x => x.GetItemFromCache<IEnumerable<Zone>>(It.IsAny<string>()));

    var organisationService = new OrganisationService(this.MockUnitOfWorkAsync.Object, this.MockApiClientFactory.Object, this.MockCache.Object);

    var results = organisationService.GetZones(1, 1).ToList();

    Assert.IsNotNull(results);
    Assert.AreEqual(3, results.Count, "There should be 3 records returned");

    this.MockCache.Verify(x => x.GetItemFromCache<IEnumerable<Zone>>(It.IsAny<string>()), Times.Once());
    this.MockHubApiClient.Verify(x => x.GetAsync<IEnumerable<Zone>>(It.IsAny<string>(), It.IsAny<IDictionary<string, string>>()), Times.Once());
}

我发现许多其他帖子都有相同的例外,但 none 的解决方案或示例与我的相同。

我已经能够在调用只有单个字符串参数的 GetAsync 方法时成功模拟响应。

    private void SetupApiClientForAllDealerDetails(IEnumerable<DealerDetail> dealerDetails)
    {
        this.MockHubApiClient.Setup(
            x => x.GetAsync<IEnumerable<DealerDetail>>(It.IsAny<string>()))
            .Returns(
                (string name) =>
                {
                    return dealerDetails == null ? Task.FromResult<IEnumerable<DealerDetail>>(null) : Task.Run(() => dealerDetails);
                });

        this.MockApiClientFactory.Setup(x => x.CreateClient(It.IsAny<string>()))
            .Returns(this.MockHubApiClient.Object);
    }

有什么想法吗?

如果您在 .Returns 中使用表达式而不是值,则该表达式的参数必须与您正在模拟的方法签名的参数相匹配。

例如,我在 SetupApiClientForGetZones:

中找到了这个
this.MockHubApiClient.Setup(x => x.GetAsync<IEnumerable<Zone>>(It.IsAny<string>(), It.IsAny<IDictionary<string, string>>()))
                .Returns(
                    (string name) =>
                      {
                        return zone == null ? Task.FromResult<IEnumerable<Zone>>(null) : Task.Run(() => zone);
                      });

真正应该是:

this.MockHubApiClient.Setup(x => x.GetAsync<IEnumerable<Zone>>(It.IsAny<string>(), It.IsAny<IDictionary<string, string>>()))
                .Returns<string, IDictionary<string, string>>(
                    (name, dict) =>
                      {
                        return zone == null ? Task.FromResult<IEnumerable<Zone>>(null) : Task.Run(() => zone);
                      });