C# 当模拟不可能时,如何单元测试类的事件是否已订阅

C# 当模拟不可能时,如何单元测试类的事件是否已订阅,c#,C#,当模拟不可能时,是否可以通过单元测试检查事件是否已订阅 我有下面的类“InteractiveEventManager”,它接受一个名为DrawingArea的类。该类实现了IEventManager,它有两个方法-Subscribe()和UnSubscribe() Subscribe方法从DrawingArea类订阅自定义事件 现在我不知道如何检查Subscribe方法是否订阅了这些事件 internal interface IEventManager { void Subscribe(

当模拟不可能时,是否可以通过单元测试检查事件是否已订阅

我有下面的类“InteractiveEventManager”,它接受一个名为DrawingArea的类。该类实现了IEventManager,它有两个方法-Subscribe()和UnSubscribe()

Subscribe方法从DrawingArea类订阅自定义事件

现在我不知道如何检查Subscribe方法是否订阅了这些事件

internal interface IEventManager
{
    void Subscribe();
    void UnSubscribe();
}

public class InteractiveEventManager: IEventManager
{
    private readonly DrawingArea _drawingArea;   
        public InteractiveEventManager(DrawingArea drawingArea)
    {
        _drawingArea = drawingArea;
    }

    public void Subscribe()
    {
        _drawingArea.MouseMove += DrawingAreaMouseMove;
        _drawingArea.PreviewMouseDown += DrawingAreaPreviewMouseDown;
    }

    private void DrawingAreaPreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        _drawingArea.Chart.InteractiveCurvesArea.ProcessMouseDown(
            e.GetPosition(_drawingArea));
    }

    private void DrawingAreaMouseMove(object sender, MouseEventArgs e)
    {
        _drawingArea.Chart.InteractiveCurvesArea.ProcessMouseMove(
            e.GetPosition(_drawingArea));
    }
}
我写了以下测试,但它不工作。因为DrawingArea是一个类(不是接口),所以我认为我们不能调用AssertWasCalled。你能帮忙吗

[Test]
public void When_register_then_drawing_area_mouse_move_is_registered()
{
    DrawingArea drawingArea = new DrawingArea();
    InteractiveEventManager interactiveEventManager = 
        new InteractiveEventManager(drawingArea);
    interactiveEventManager.Subscribe();

    drawingArea.AssertWasCalled(x => x.MouseMove += 
        Arg<MouseEventHandler>.Is.Anything);
}
[测试]
注册时公共无效,然后绘图区域鼠标移动已注册()
{
DrawingArea DrawingArea=新DrawingArea();
InteractiveEventManager InteractiveEventManager=
新的InteractiveEventManager(drawingArea);
interactiveEventManager.Subscribe();
调用drawingArea.AssertWas(x=>x.MouseMove+=
Arg.Is.Anything);
}

谢谢。

我首先要尝试在接口后面抽象DrawingArea类。否则,这不是真正的单元测试,而是集成测试。对于单元测试,使用反射是完全合法的,因此,如果
DrawingArea
超出您的控制,您可以使用这种技术:我将首先尝试在接口后面抽象DrawingArea类。否则,这不是真正的单元测试,而是集成测试。对于单元测试,使用反射是完全合法的,因此如果
DrawingArea
超出您的控制范围,您可以使用以下技术: