在带有 CQRS 模式的 Moq 中使用通用接口

Use generic interface in Moq with CQRS pattern

我有一个接口 ICommand -> 标记接口:

public interface ICommand
{
}

另一个接口 ICommandHandle:

public interface ICommandHandler<T> where T : ICommand
{
    Task HandleAsync(T command);
}

接下来是 ICommandDispatcher:

public interface ICommandDispatcher : ICommand
{
    Task DispatchAsync<T>(T command) where T : ICommand; 
}

和 CommandDispatcher class:

public class CommandDispatcher : ICommandDispatcher
{
    private readonly IComponentContext _context;

    public CommandDispatcher(IComponentContext componentContext)
    {
        _context = componentContext;
    }

    public async Task DispatchAsync<T>(T command) where T : ICommand
    {
        if (command == null)
            throw new ArgumentNullException(nameof(command), "Command can not be null");

        var handler = _context.Resolve<ICommandHandler<T>>();
        await handler.HandleAsync(command);
    }
}

我正在编写一个单元测试来检查用户是否存在。 我想调用我的处理程序并完成整个过程,如创建用户、验证输入参数等。当然在内存中,在这种情况下我不会连接到我的真实数据库。我的问题是这段代码是否正确。

var commandDispatcher = new Mock<ICommandHandler<CreateUser>>();
var command = new CreateUser
{
    Name = "user",
    Email = "user@email.com"
};

var client = new Client("user", "user@email.com");
commandDispatcher.Setup(x => x.HandleAsync(command));   

我想知道我是否应该在测试中使用

new Mock<ICommandHandler>

new Mock<ICommandDispatcher>

看完下面的评论后,我想知道我是否混淆了单元测试和集成测试?

我觉得这个教程很好:https://youtu.be/ub3P8c87cwk

此外,单元测试可能意味着“测试一个特定的 class”。 因此您可以测试 CreateUserHandler 是否正确调用 HandleAsync()。 但是您实际上无法测试是否创建了用户,因为它是需要调用多个“单元”的操作。为此,通常使用集成测试。