【问题标题】:Use generic interface in Moq with CQRS pattern在 Moq 中使用具有 CQRS 模式的通用接口
【发布时间】:2021-03-07 18:44:01
【问题描述】:

我有一个接口 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 类:

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>

阅读下面的 cmets 后,我想知道我是否将单元测试与集成测试混淆了?

【问题讨论】:

  • 当前状态下的问题不完整,因此不清楚。您能否重新格式化问题,以便我们更清楚地了解当前问题以及您实际上想要做什么?请参阅How to Ask 页面以获得澄清此问题的帮助。
  • "我正在编写单元测试,它将检查用户是否存在。" - 这是一个实际 单元测试,还是当你真正的意思是集成测试时你误用了“单元测试”这个词?
  • ICommandHandler 本身是通用的吗? T command 在哪里/如何定义?
  • 我更正了我的帖子,请给我更多信息。

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


【解决方案1】:

我觉得这个教程不错:https://youtu.be/ub3P8c87cwk

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

【讨论】:

  • 这是一个单元测试吗:例如,我调用我的处理程序来创建新用户。而且我输入了名称属性空白,此测试调用我的处理程序并返回错误,如参数不能为空或空白?这是单元测试还是集成测试?
  • 在这种情况下,您可以对负责验证“创建客户”请求的“单元”进行单元测试。但问题是谁负责这个验证?调用的处理程序或其他东西?如果您将代码结构化为处理程序负责验证,那么您可以为 handlerClass 创建单元测试方法,以检查在使用不正确的数据调用 handler.invoke 时是否应用了验证规则
  • 如果您的处理程序是验证请求的唯一方法,那么是的,检查您的处理程序是否抛出异常的方法(测试)是单元测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2011-11-13
相关资源
最近更新 更多