Jeśli chodzi o testowanie Eventów, to ja sobie zrobiłem coś takiego banalnego i myślę, że większość używa takiego właśnie mechanizmu:
MyItem item = new MyItem();
bool eventFired = false;
item.EventToTest += (s, e) => eventFired = true;
item.DoSomeWork();
Assert.IsTrue(eventFired);
Tutaj tworzymy event handlera, który po prostu ma ustawić wartość zmiennej. Potem wywołujemy metodę, która powinna wywołać dany event. I tyle.
Dziękuję, podejście wygląda ciekawie. Jako że zdecydowałem się wszędzie pozastępować delegaty
Prismowym EventAggregator
, to po prostu testowałem zmiany we własnościach klasy które miały nastąpić po publikacji eventu. Co myślisz o takim podejściu? (przykłady poniżej)
[Fact]
public void DataUpdateEvent_Publish_UpdatesDataUpdateModulesProperty()
{
UpdateModules update = new UpdateModules()
{
RacesPl = true,
HCzFrom = 20
};
_dataUpdateEvent.Publish(update);
Assert.True(_viewModel.DataUpdateModules.RacesPl);
Assert.Equal(20, _viewModel.DataUpdateModules.HCzFrom);
Assert.Equal(update, _viewModel.DataUpdateModules);
}
[Fact]
public void LoadDataEvent_Publish_LoadsData()
{
_viewModel.Horses.Clear();
_viewModel.Jockeys.Clear();
_viewModel.Races.Clear();
_loadDataEvent.Publish();
Assert.NotEmpty(_viewModel.Horses);
Assert.NotEmpty(_viewModel.Jockeys);
Assert.NotEmpty(_viewModel.Races);
}
[Fact]
public void ProgressBarEvent_Publish_UpdatesProperties()
{
ProgressBarData bar = new ProgressBarData()
{
JobType = "unit test",
LoopCouner = 100,
FromId = 10,
ToId = 1010
};
_progressBarEvent.Publish(bar);
Assert.Equal(10, _viewModel.UpdateStatusBar);
Assert.Equal("unit test", _viewModel.WorkStatus);
Assert.Equal("100 / 1000", _viewModel.ProgressDisplay);
}