【问题标题】:Unit test Moq generic type单元测试起订量通用类型
【发布时间】:2020-03-05 08:00:55
【问题描述】:

我正在尝试测试一个返回泛型类型接口的方法,但我总是收到此错误:

System.ArgumentException : 无效回调。在具有 0 个参数的方法上设置不能调用具有不同数量参数 (1) 的回调。在 Moq.MethodCall.SetReturnsResponse g__ValidateCallback|27_0(委托回调)

测试方法:

//Arrange
Mock<IClientService> clientService = new Mock<IClientService>();

clientService
    .Setup(x => x.GetRabbitClient<AlertRequest>())
    .Returns<IMessageQueueClient<AlertRequest>>(x => new Mock<IMessageQueueClient<AlertRequest>>().Object);

//Act
var client = clientService.Object.GetRabbitClient<AlertRequest>();

//Assert
Assert.NotNull(client);

ClientService 类:

public class ClientService : IClientService
{
    /// <inheritdoc />
    public IMessageQueueClient<TMessage> GetRabbitClient<TMessage>() where TMessage : class, new()
    {
        ServiceCollection serviceCollection = new ServiceCollection();
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();
        serviceCollection.UseMessageQueueOptions<RabbitMQSettings>(configuration);
        serviceCollection.UseMessageQueueFor<TMessage>();
        var serviceProvider = serviceCollection.BuildServiceProvider();

        return serviceProvider.GetRequiredService<IMessageQueueClient<TMessage>>();
    }
}

【问题讨论】:

  • 可能是Object有问题?您在 Returns 和 Act 中使用 .Object。尝试在 Returns 中删除 .Object
  • 如果我删除 Returns 中的对象,我会得到这个:无法将类型 'Mock>' 隐式转换为 'IMessageQueueClient'。存在显式转换(您是否缺少演员表?)
  • 然后移回 .Object in return in try this var client = clientService.GetRabbitClient();

标签: c# .net unit-testing mocking moq


【解决方案1】:

ClientService 是正在测试的类,所以你不需要模拟它。我会这样做:

//Arrange
var clientService = new ClientService();

//Act
var client = clientService.GetRabbitClient<AlertRequest>();

//Assert
Assert.NotNull(client);

【讨论】:

  • K.I.S.S.我想:)
  • 很高兴我的回答很有帮助 ;)
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多