Prism TDD Unsubscribe()

本文关键字:Unsubscribe TDD Prism | 更新日期: 2023-09-27 18:16:27

我正在使用TDD,并希望为PubSubEvent中可用的Unsubscribe()方法编写一个单元测试。因为没有接口作为你从父类继承的,父类没有接口,所以我不知道如何测试它。

我的服务和方法,我想测试一下:

public class FrameService: IFrameService
{
     private readonly IEventAggregator _eventAggregator;
     public void UnsubscribeEvents()
     {
         _eventAgregator.GetEvent<FrameAddedEvent>()
                        .Unsubscribe(FrameAddedEventHandler); // How to unit test this?
      }
 }

FrameAddedEvent类,继承自Prism库中的PubSubEvent:

public class FrameAddedEvent: PubSubEvent<Frame>
{
}

在Prism库中的声明:

public class PubSubEvent<TPayload> : EventBase
{  
    public SubscriptionToken Subscribe(Action<TPayload> action);
}

我对代码行的第一部分的测试(使用MSTest和Moq)。现在我需要另一个UnitTest,在Unsubscribe()

上断言
[TestClass]
public class FrameServiceTest
{
    private Mock<IEventAgregator> _eventAgregator;
    [TestMethod]
    public void When_SubscribeEvents_Then_Get_FrameAddedEvent_From_EventAggregator()
    {
        var frameAddedEvent = new FrameAddedEvent();
        _eventAgregator.Setup(x=>x.GetEvent<FrameAddedEvent>())
                                   .Returns(frameAddedEvent);
        _frameService.SubscribeEvents();
        _serviceLayerEventAgregator.Verify(x => x.GetEvent<FrameAddedEvent>(), Times.Once);
    }
}

答:请看下面的解释,我只是为那些可能和我有同样问题的人添加了代码。

伪类:

public class FakeFrameAddedEvent : FrameAddedEvent
{
    public bool Unsubscribed { get; private set; }
    public FakeFrameAddedEvent()
    {
        Unsubscribed = false;
    }
    public override void Unsubscribe(Action<Frame> subscriber)
    {
        Unsubscribed = true;
    }
}

和新的UnitTest:

    [TestMethod]
    public void When_UnsubscribeEvents_Then_Unsubscribe_Is_Call()
    {
        var frameAddedEvent = new FakeFrameAddedEvent();
        _serviceLayerEventAgregator.Setup(x => x.GetEvent<FrameAddedEvent>())
                                   .Returns(frameAddedEvent);
        _frameService.UnsubscribeEvents();
        Check.That(frameAddedEvent.Unsubscribed).IsTrue();
    }

Prism TDD Unsubscribe()

首先,PubSubEvent是prism的一部分,它带来了自己的一组测试,所以我怀疑您是否有必要为此编写自己的测试。

话虽这么说,您可以测试EventAggregator周围的东西,包括您自己的事件,例如: