Вызвать обратный вызов в Moq - PullRequest
1 голос
/ 03 декабря 2009

У меня есть метод, который выполняет асинхронный вызов службы. Я вызываю этот класс, передавая обратный вызов.

public void GetRights(EventHandler<GetRightsCompletedEventArgs> callback)
{
    ServiceClient client = new ServiceClient();
    client.GetRightsCompleted += new EventHandler<GetRightsCompletedEventArgs>(callback);
    client.GetRightsAsync();
}

GetRights(GetRightsCallback);

Я создаю тесты с помощью MSTest, и я смоделировал содержащий класс (IGetRightsProxy) в Moq. Как я могу вызвать обратный вызов, когда этот метод вызывается в тесте?

GetRightsForCurrentUserCompletedEventArgs results = 
    new GetRightsCompletedEventArgs(
    new object[] { new ObservableCollection<Right>()}, null, false, null);
Mock<IGetRightsProxy> MockIGetRightsProxy = new Mock<GetRightsProxy>();

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Вы хотите посмотреть на расширение Moq Callback() на своей макете;

Mock<IGetRightsProxy> mock = new Mock<IGetRightsProxy>();
mock.Setup(x => x.GetRights(It.IsAny<EventHandler<GetRightsCompletedEventArgs>>())
  .Callback<EventHandler<GetRightsCompletedEventArgs>>(
    callback => callback(mock.Object, new GetRightsCompletedEventArgs())
  );

Когда тестируемый код вызывает GetRights() на макете IGetRightsProxy фактического EventHandler<GetRightsCompletedEventArgs>, который он передает, впоследствии он передается в метод Callback() Moq.

Примечание. Вывод типа будет работать с универсальным типом, примененным к Callback(), но я считаю, что в этих случаях немного удобнее читать явное определение типа, передаваемого в метод.

0 голосов
/ 08 декабря 2009

Один из способов сделать то, что я хочу, - расширить класс следующим образом:

class MockGetRightsProxy : IGetRightsProxy
{
    public void GetRights(EventHandler<GetRightsCompletedEventArgs> callback)
    {
        // Create some args here
        GetRightsCompletedEventArgs args = new GetRightsCompletedEventArgs(
            new object[] { new ObservableCollection<Right>() }, null, false, null);

        callback(null, args);
    }

}

Я искал способы вызова обратного вызова в Moq, но это тоже работает.

...