下面是我的接口,它具有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);
}
}
答案 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);
}