Есть ли способ имитировать системные события в С#, такие как SystemEvents.PowerModeChanged
, и искусственно вызывать их в настройке MOQ?
Моделирование системных событий с использованием MOQ
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
Нет, не напрямую.
Я вижу два пути достижения этого:
Путем реализации интерфейса перед системным событием
Используя обходную платформу, такую как Moles Framework или Подделки Microsoft
person
Matt B-L
schedule
06.08.2013