使用与另一种方法相同的签名来模拟抽象方法

时间:2015-11-16 10:45:14

标签: c# unit-testing moq

我有两种几乎相同签名的方法。唯一的区别是其中一个使用特定类型而另一个使用基类

public abstract class CommandHandlerBase<TCommand> : ICommandHandler<TCommand>
        where TCommand : CommandBase
{
    public int Id { get; }

    public CommandHandlerBase(int id)
    {
        this.Id = id;
    }

    public bool CanHandle(CommandBase command, Context context)
    {
        if (command.GetType() == typeof(TCommand))
            return CanHandle((TCommand)command, context);
        else
            return false;
    }

    public abstract bool CanHandle(TCommand command, Context context);

    public IEnumerable<EventBase> Handle(CommandBase command)
    {
        if (command.GetType() == typeof(TCommand))
            return Handle((TCommand)command);
        else
            throw new ArgumentException("The handler cannot handle the given command type");
    }

    public abstract IEnumerable<EventBase> Handle(TCommand command);
}

现在我试图声明如果命令类型是正确的类型,则会调用特定的方法。

这是我到目前为止所做的:

var commandHandlerBaseMock = new Mock<CommandHandlerBase<TestCommand1>>(id);
commandHandlerBaseMock.CallBase = true;
var command = new TestCommand1();
commandHandlerBaseMock.Setup(ch => ch.CanHandle(command, null)).Returns(true);

bool result = commandHandlerBaseMock.Object.CanHandle(command, null);

result.Should().BeTrue();

问题在于,这断言调用被调用的方法,这根本没有用。实施永远不会受到影响 有没有办法模拟方法的一个特定重载?

1 个答案:

答案 0 :(得分:0)

这种代码结构是不可持续的......你在instanceOf检查中添加(通常是一个坏的标志)并试图以多态方式隐藏签名。 TCommand类型的对象总是会遇到基类中TCommand特定的实现,我期待。

如果您需要两个不同的处理程序,基于两种不同的类型,请考虑根本没有基类实现使用&#34; Tell,Don&#t; Ask&#34;原则并将处理推送到命令本身(您可以使用&#34;模板方法&#34;抽象处理程序中的模式来执行&#34;泛型的东西&#34;),这意味着您不需要基类中依赖于某些类型的任何专业代码。