Моделирование системных событий с использованием MOQ

Есть ли способ имитировать системные события в С#, такие как SystemEvents.PowerModeChanged, и искусственно вызывать их в настройке MOQ?


person TheWolf    schedule 06.08.2013    source источник
comment
Это то, что вы ищете? code.google.com/p/moq/wiki/QuickStart#Events   -  person Claudio Redi    schedule 07.08.2013
comment
Однако событие не принадлежит издеваемому типу. Событие, которое мне нужно смоделировать, является частью SystemEvents.   -  person TheWolf    schedule 07.08.2013
comment
Вы можете создать интерфейс (который можно высмеивать), который предоставляет вам SystemEvents. Очень похоже на то, что делается, когда IDateTimeService имитирует DateTime.Now.   -  person DavidN    schedule 07.08.2013


Ответы (2)


Немного поздно, но вот пример реализации с интерфейсом перед 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);
         }
     }
 }
person StefGriebel    schedule 13.02.2017

Нет, не напрямую.

Я вижу два пути достижения этого:

  1. Путем реализации интерфейса перед системным событием

  2. Используя обходную платформу, такую ​​как Moles Framework или Подделки Microsoft

person Matt B-L    schedule 06.08.2013