【问题标题】:Mocking system events using MOQ使用 MOQ 模拟系统事件
【发布时间】:2013-08-06 21:06:39
【问题描述】:

有没有办法在 C# 中模拟系统事件,例如 SystemEvents.PowerModeChanged,并在 MOQ 设置中人为地提高它们?

【问题讨论】:

  • 该事件不属于模拟类型。我需要模拟的事件是 SystemEvents 的一部分。
  • 您可以创建一个接口(可以模拟),将 SystemEvents 暴露给您。与通过“IDateTimeService”模拟 DateTime.Now 所做的非常相似。

标签: c# mocking moq systemevent


【解决方案1】:

有点晚了,但这里有一个在 SystemEvent 前面提到的接口的实现示例:

界面:

public interface ISystemEvents
{
    event PowerModeChangedEventHandler PowerModeChanged;
}

适配器类:

public class SystemEventsAdapter : ISystemEvents
{
    public event PowerModeChangedEventHandler PowerModeChanged;
}

您在活动中的注册:

public class TestClass {

   private readonly ITestService _testService;

   public TestClass(ISystemEvents systemEvents, ITestService testService) {
      _testService = testService;
      systemEvents.PowerModeChanged += OnPowerModeChanged;
   }

   private void OnPowerModeChanged(object sender, PowerModeChangedEventArgs e)
   {
      if (e.Mode == PowerModes.Resume)
      {
          _testService.DoStuff();
      }
   }
}

测试:

[TestFixture]
public class TestClassTests
{
     private TestClass _cut;

     private Mock<ISystemEvents> _systemEventsMock;         
     private Mock<ITestService> _testServiceMock;

     [SetUp]
     public void SetUp()
     {
         _systemEventsMock = new Mock<ISystemEvents>();
         _testServiceMock = new Mock<ITestService>();

         _cut = new TestClass(
            _systemEventsMock.Object,
            _testServiceMock.Object
         );
     }

     [TestFixture]
     public class OnPowerModeChanged : TestClassTests
     {
         [Test]
         public void When_PowerMode_Resume_Should_Call_TestService_DoStuff()
         {
             _systemEventsMock.Raise(m => m.PowerModeChanged += null, new PowerModeChangedEventArgs(PowerModes.Resume));

             _testServiceMock.Verify(m => m.DoStuff(), Times.Once);
         }
     }
 }

【讨论】:

    【解决方案2】:

    不,不直接。

    我看到了两种方法来实现这一点:

    1. 通过在systemEvent前面实现一个接口

    2. 通过使用迂回框架,例如Moles FrameworkMicrosoft Fakes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2019-09-11
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多