C# 单元测试Moq通用类型

C# 单元测试Moq通用类型,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我试图测试一个方法,该方法返回一个泛型类型的接口,但我总是遇到以下错误: System.ArgumentException:无效回调。具有0个参数的方法上的安装程序无法使用不同数量的参数(1)调用回调。在Moq.MethodCall.SetReturnsResponse g_uValidateCallback | 27_0(委托回调) 试验方法: //Arrange Mock<IClientService> clientService = new Mock<IClientSer

我试图测试一个方法,该方法返回一个泛型类型的接口,但我总是遇到以下错误:

System.ArgumentException:无效回调。具有0个参数的方法上的安装程序无法使用不同数量的参数(1)调用回调。在Moq.MethodCall.SetReturnsResponse g_uValidateCallback | 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);
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>>();
    }
}
//排列
Mock clientService=new Mock();
客户服务
.Setup(x=>x.GetRabbitClient())
.Returns(x=>newmock().Object);
//表演
var client=clientService.Object.GetRabbitClient();
//断言
Assert.NotNull(客户端);
客户服务类别:

//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);
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>>();
    }
}
公共类ClientService:IClientService
{
/// 
公共IMessageQueueClient GetRabbitClient(),其中TMessage:class,new()
{
ServiceCollection ServiceCollection=新ServiceCollection();
IConfigurationRoot配置=新配置生成器()
.AddJsonFile(“appsettings.json”)
.Build();
serviceCollection.UseMessageQueueOptions(配置);
serviceCollection.UseMessageQueueFor();
var serviceProvider=servicecolection.BuildServiceProvider();
返回serviceProvider.GetRequiredService();
}
}

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

//Arrange
var clientService = new ClientService();

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

//Assert
Assert.NotNull(client);
//排列
var clientService=new clientService();
//表演
var client=clientService.GetRabbitClient();
//断言
Assert.NotNull(客户端);

可能是对象有问题吗?在Returns和Act中使用.Object。尝试删除Returns中的对象如果我删除Returns中的对象,我会得到这个结果:无法将类型“Mock”隐式转换为“IMessageQueueClient”。存在显式转换(是否缺少强制转换?),然后向后移动。中的对象返回try this var client=clientService.GetRabbitClient();K.I.S.S.我想:)很高兴我的回答很有帮助;)