Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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_Tdd_Nunit - Fatal编程技术网

C# 单元测试事件触发行为

C# 单元测试事件触发行为,c#,unit-testing,tdd,nunit,C#,Unit Testing,Tdd,Nunit,我已经使用了一段时间的模式。我想知道我做的事情是否正确。我有一个控制器类,它侦听事件,并在引发事件时执行私有方法。有点像这样: public class MyController { public MyController(IMyEventRaiser eventRaisingObject) { eventRaisingObject.MyEvent += HandleEvent; } private void HandleEvent(objec

我已经使用了一段时间的模式。我想知道我做的事情是否正确。我有一个控制器类,它侦听事件,并在引发事件时执行私有方法。有点像这样:

public class MyController
{

    public MyController(IMyEventRaiser eventRaisingObject)
    {
        eventRaisingObject.MyEvent += HandleEvent;
    }

    private void HandleEvent(object sender, EventArgs args)
    {
        // SOME STUFF I WANT TO TEST!!
    }
}


public class EventRaisingClass : IMyEventRaiser
{
    public event EventHandler<EventArgs> MyEvent;
}
公共类MyController
{
公共MyController(IMyEventRaiser事件引发对象)
{
eventRaisingObject.MyEvent+=HandleEvent;
}
私有void HandleEvent(对象发送方、事件args args)
{
//一些我想测试的东西!!
}
}
公共类EventRaisingClass:IMyEventRaiser
{
公共事件事件处理程序;
}
在MyController.HandleEvent中测试代码的唯一方法是创建一个存根:IMyEventRaiser来引发代码

我不确定这个设计是否合适。一方面,我希望保持HandleEvent方法私有,以说明只有事件才能触发它。另一方面,私有方法包含关键的业务逻辑,所以我觉得它应该是公共的,或者至少是内部的,这也会使单元测试更容易

你们认为呢

问候,,
莫顿

你研究过模拟框架吗?“Moq”支持从模拟类型引发事件:

Mock<IMyEventRaiser> mock = new Mock<IMyEventRaiser>()
mock.Raise(e => e.MyEvent, EventArgs.Empty);
Mock Mock=new Mock()
mock.Raise(e=>e.MyEvent,EventArgs.Empty);

你所得到的听起来像是(轻微)违反了法律。控制器既响应事件,又保存为特定事件执行的复杂逻辑。如果您的控制器只是将必要的数据发送到执行实际工作的专用处理器,该怎么办?处理器的方法必须是公共的,因此是可测试的!TDD指出SRP违规是不是很好?

是的,我就是这么做的。但你对这种模式的总体看法如何?:-)@Morten我一般不喜欢依赖事件被触发,但是你的实现看起来很好,完全合法。啊,你说我同时控制和调解?我应该考虑拆分这两个,在这里,我现在用私有方法执行的控制部分应该属于它自己的类,可能是这样。我的意思是值得考虑拆分。为什么不像其他私有方法一样使用私有访问器(即反射)来测试您的私有方法呢?这对我来说是一个未知的过程。我一定会查的:-)你所做的没有什么不合适的。不过有一条评论:你可能需要一个模拟的,甚至是一个假的,但不是存根。通常,存根不做任何事情,也不能触发任何事件。