具有对象列表的模拟通用方法

时间:2018-12-04 11:54:23

标签: c# unit-testing moq

下面是我的接口,它具有2种方法,一种方法除单个ICommand对象外,第二种方法除ICommnd对象列表外。

我的第一种方法正常工作。但我的第二种方法不是通过Mock调用。但是实际的实现被调用了。

有人可以建议我在想什么。

public interface ICommandBus
{
    void Dispatch<TCommand>(TCommand command) where TCommand : ICommand;

    void Dispatch<TCommand>(IList<TCommand> commands) where TCommand : ICommand;

}


    [Test]
    public void Test_Should_Work()
    {
        var commands = new List<ICommand>();
        var mockDispatcher = Container.Instance.RegisterMock<ICommandBus>();
        mockDispatcher.Setup(x => x.Dispatch(It.IsAny<ICommand>())).Callback<ICommand>(x => commands.Add(x));
        mockDispatcher.Setup(x => x.Dispatch(It.IsAny<IList<ICommand>>())).Throws(new Exception("Some Error"));


        var commandBus = SportsContainer.Resolve<ICommandBus>();

        var commandslist = new List<UpdateCommand>()
        {
            new UpdateCommand(),
            new UpdateCommand()
        };

         //first call is working 
        commandBus.Dispatch<UpdateCommand>(commandslist[0]);

        //its not working. expected should throw an exception. but nothing is happening. 
        commandBus.Dispatch<UpdateCommand>(commandslist);


    }
}

2 个答案:

答案 0 :(得分:1)

您的测试不会测试您的任何代码,而只是验证松散的模拟是否有效。您不能对接口进行单元测试。

您的代码不会抛出,因为您使用了一个松散的模拟(默认),该模拟不执行任何操作,并且对于任何非设置调用仅返回null。您将List<UpdateCommand>传递给与It.IsAny<IList<ICommand>>()设置的呼叫,该呼叫不匹配,因此您的.Throws()不会执行,而会返回null

不要嘲笑被测类,因为那样的话您根本就不会测试任何东西。

所以您要测试实现:

var dispatcher = new YourDispatcher():
dispatcher.Dispatch<UpdateCommand>(commandslist[0]);
dispatcher.Dispatch<UpdateCommand>(commandslist);

答案 1 :(得分:0)

我终于能够得到我需要的东西。我需要在定义ICommand的安装程序方面很具体,并且可以正常工作。

[Test]
public void Test_Should_Work()
{
        var commands = new List<ICommand>();
        var mockDispatcher = Container.Instance.RegisterMock<ICommandBus>();
        mockDispatcher.Setup(x => x.Dispatch(It.IsAny<IList<UpdateCommand>>())).Throws(new Exception("Some Error"));

        var commandBus = SportsContainer.Resolve<ICommandBus>();

        var commandslist = new List<UpdateScheduleCommand>()
        {
            new UpdateCommand(),
            new UpdateCommand()
        };

        //first call is working 
        //commandBus.Dispatch<UpdateScheduleCommand>(commandslist[0]);

        //its Working now.
        commandBus.Dispatch(commandslist);

}