Я использую протоколирование ETW.Вот мои коды:
[EventSource(Name = "MyEventSource")]
public sealed class MyEventSource : EventSource
{
public static MyEventSource Log { get; set; } = new MyEventSource();
[NonEvent]
public void Register()
{
Registrator eventSourceRegistrator = new Registrator(this);
eventSourceRegistrator.Register();
}
[Event(120, Message = "App started.Process path: {0}", Level = EventLevel.Informational, Channel = EventChannel.Admin)]
public void ServerStarted(string proccessPath)
{
Register();
WriteEvent(120, proccessPath);
}
}
Я пытаюсь написать модульный тест для этого.Для получения журналов из средства просмотра событий я использую EventLogReader и EventRecord:
[TestMethod]
public void EventLogTest()
{
MyApp myApp = new MyApp();
var appStartedLog = GetEventRecordFromEventID(120);
Assert.IsNotNull(appStartedLog);
}
EventRecord GetEventRecordFromEventID(int eventID)
{
string source = "MyEventSource/Admin";
string query = $"*[System/EventID={eventID}]";
var elQuery = new EventLogQuery(source, PathType.LogName, query);
using (var elReader = new EventLogReader(elQuery))
{
List<EventRecord> eventRecords = new List<EventRecord>();
for (EventRecord eventInstance = elReader.ReadEvent(); eventInstance != null; eventInstance = elReader.ReadEvent())
{
eventRecords.Add(eventInstance);
}
var res = eventRecords.OrderBy(a => a.TimeCreated).LastOrDefault();
return res;
}
}
Также класс MyApp:
public class MyApp
{
public MyApp()
{
Start();
}
public void Start()
{
var proccessPath = Process.GetCurrentProcess().MainModule.FileName;
MyEventSource.Log.ServerStarted(proccessPath);
}
}
Когда я очищаю журнал из средства просмотра событий и запускаю EventLogTest, происходит сбой.Но после провала теста я снова проверил просмотрщик событий, и у меня есть журнал:
![Log in Event Viewer](https://i.stack.imgur.com/kh1Uc.png)
Затем я изменил свой тест:
[TestMethod]
public void EventLogTest()
{
MyApp myApp = new MyApp();
Thread.Sleep(2000);
var appStartedLog = GetEventRecordFromEventID(120);
Assert.IsNotNull(appStartedLog);
}
Теперь я очищаю логи и запускаю тест.Это проходит.Мой вопрос: почему он регистрируется через 2 секунды и как написать для этого модульный тест?