使用最小起订量模拟系统事件

本文关键字:模拟系统 事件 | 更新日期: 2023-09-27 18:26:43

有没有一种方法可以模拟C#中的系统事件,如SystemEvents.PowerModeChanged,并在MOQ设置中人工引发它们?

使用最小起订量模拟系统事件

稍晚,但这里有一个在SystemEvent Matt前面有接口的实现示例:

接口:

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

否,不直接。

我认为有两种方法可以实现这一点:

  1. 通过在系统前面实现接口Event

  2. 通过使用迂回框架,如Moles framework或Microsoft Fakes