Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证是否在操作中调用了该方法_C#_Unit Testing_Moq_Xunit - Fatal编程技术网

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());