В моем модульном тесте, как я могу проверить, что событие вызвано издеваемым объектом.Проверить, что событие было вызвано издеваемым объектом
У меня есть представление (UI) -> ViewModel -> DataProvider -> ServiceProxy. ServiceProxy выполняет асинхронный вызов для работы с сервером. Когда операция async завершена, вызывается метод в DataProvider (метод обратного вызова передается как параметр метода). Затем метод обратного вызова поднимает и событие, которое прослушивает ViewModel.
Для проверки ViewModel я макетирую DataProvider и проверяю, существует ли обработчик для события, поднятого DataProvider. При тестировании DataProvider я макетирую ServiceProxy, но как я могу проверить, вызван ли метод обратного вызова, и возникает событие.
Я использую RhinoMock 3.5 и синтаксис AAA
Благодаря
- DataProvider -
public partial class DataProvider
{
public event EventHandler<EntityEventArgs<ProductDefinition>> GetProductDefinitionCompleted;
public void GetProductDefinition()
{
var service = IoC.Resolve<IServiceProxy>();
service.GetProductDefinitionAsync(GetProductDefinitionAsyncCallback);
}
private void GetProductDefinitionAsyncCallback(ProductDefinition productDefinition, ServiceError error)
{
OnGetProductDefinitionCompleted(this, new EntityEventArgs<ProductDefinition>(productDefinition, error));
}
protected void OnGetProductDefinitionCompleted(object sender, EntityEventArgs<ProductDefinition> e)
{
if (GetProductDefinitionCompleted != null)
GetProductDefinitionCompleted(sender, e);
}
}
- ServiceProxy -
public class ServiceProxy : ClientBase<IService>, IServiceProxy
{
public void GetProductDefinitionAsync(Action<ProductDefinition, ServiceError> callback)
{
Channel.BeginGetProductDefinition(EndGetProductDefinition, callback);
}
private void EndGetProductDefinition(IAsyncResult result)
{
Action<ProductDefinition, ServiceError> callback =
result.AsyncState as Action<ProductDefinition, ServiceError>;
ServiceError error;
ProductDefinition results = Channel.EndGetProductDefinition(out error, result);
if (callback != null)
callback(results, error);
}
}
помощь по обоим будет здорово. спасибо – joblot
извините за задержку. для второго теста проблема DoSomethingThatShouldRiaseEvent не является общедоступным методом DataProvider. Это метод обратного вызова, который передается ServiceProxy. спасибо – joblot
Возможно, это поможет, если вы предоставили методы DataProvider и как они взаимодействуют с классом ServiceProxy. Я думаю, что разделение этого на два отдельных модульных теста - хорошее начало. Затем вы можете стать более привлекательным и связать их с интеграционным тестом (хотя только отдельные тесты помогут гарантировать, что отдельные компоненты ведут себя так, как они были разработаны/ожидаются). – PatrickSteele