C# 验证是否在操作中调用了该方法
这些天我一直在练习单元测试,所以如果我不理解一些基础知识,请容忍我 有这些简单的抽象:C# 验证是否在操作中调用了该方法,c#,unit-testing,moq,xunit,C#,Unit Testing,Moq,Xunit,这些天我一直在练习单元测试,所以如果我不理解一些基础知识,请容忍我 有这些简单的抽象: public interface ITaskFactory { void StartTask(Action action); } internal sealed class TaskFactory : ITaskFactory { public void StartTask(Action action) { Task.Factory.StartNew(action);
public interface ITaskFactory
{
void StartTask(Action action);
}
internal sealed class TaskFactory : ITaskFactory
{
public void StartTask(Action action)
{
Task.Factory.StartNew(action);
}
}
以及要测试的此类(简化为这种情况):
内部密封类TriggerEventDecorator:ITriggerEvent,其中TeEvent:IEEvent
{
私有只读ITaskFactory(任务工厂);
私有只读功能工厂;
公共触发器EventDecorator(ITaskFactory任务工厂、Func工厂)
{
_taskFactory=taskFactory;
_工厂=工厂;
}
公共无效触发器(TEvent evt)
{
_taskFactory.StartTask(()=>
{
_工厂()触发器(evt);
});
}
}
我对这门课的测试是:
public class TriggerEventDecoratorTests
{
[Fact]
public void CanTriggerEventHandler()
{
var evt = new FakeEventWithoutValidation();
Assert.IsAssignableFrom<IEvent>(evt);
var decorated = new Mock<ITriggerEvent<FakeEventWithoutValidation>>(MockBehavior.Strict);
decorated.Setup(x => x.Trigger(evt));
var taskFactory = new Mock<ITaskFactory>(MockBehavior.Strict);
taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>()));
var decorator = new TriggerEventDecorator<FakeEventWithoutValidation>(taskFactory.Object, () => decorated.Object);
decorator.Trigger(evt);
taskFactory.Verify(x => x.StartTask(It.IsAny<Action>()), Times.Once);
decorated.Verify(x => x.Trigger(evt), Times.Once); // This line is not verified
}
}
公共类触发事件还原测试
{
[事实]
公共无效CanTriggerEventHandler()
{
var evt=新的FakeEventWithoutValidation();
Assert.IsAssignableFrom(evt);
var=newmock(MockBehavior.Strict);
修饰的.Setup(x=>x.Trigger(evt));
var taskFactory=new Mock(MockBehavior.Strict);
taskFactory.Setup(factory=>factory.StartTask(It.IsAny());
var decorator=newTriggerEventDecorator(taskFactory.Object,()=>decorated.Object);
修饰触发器(evt);
验证(x=>x.StartTask(It.IsAny()),Times.one);
修饰的.Verify(x=>x.Trigger(evt),Times.Once);//此行未验证
}
}
行修饰。验证(x=>x.Trigger(evt),次。一次)代码>未被验证,它从未被调用
如何测试这是否在\u taskFactory
的操作中触发?您没有调用Func
方法。这就是问题所在。。。为此,您必须使用Callback
方法
更改以下sertup:
taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>()));
taskFactory.Setup(factory=>factory.StartTask(It.IsAny());
致:
taskFactory.Setup(factory=>factory.StartTask(It.IsAny()))
.Callback((action)=>action());
一般来说,当一个单元测试中有多个模拟时,这意味着开发人员感到困惑,不知所措。在这里,我想它发生了。你打算考什么?如果您想测试TriggerEventDecorator
,那么为什么要模拟它呢?非常感谢您,现在就掌握了使用.Callback(…)
的诀窍!再次感谢!:-)
taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>()));
taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>()))
.Callback<Action>((action) => action());