Улучшение насмешливых делегатов - PullRequest
2 голосов
/ 26 августа 2011

Я использую Rhino Mocks.У меня есть хранилище данных, небольшая его часть определяется следующим образом:

interface IDataRepository
{
    void GetCurrentUserId(Action<int?> callback);
}

Это на стороне клиента приложения служб RIA silverlight, поэтому у нас есть обратный вызов Action.После завершения операции на сервере произойдет обратный вызов, и будет получен результат.

Для модульного тестирования чего-либо, вызывающего этот метод, в итоге я делаю это:

private delegate void GetCurrentUserIdDelegate(Action<int?> callback);

private void GetCurrentUserId(Action<int?> callback)
{
    callback.Invoke(10);
}

[TestMethod]
public void TestBlah()
{
    var mockRepository = MockRepository.GenerateMock<IDataRepository>();

    mockRepository.Expect(r => r.GetCurrentUserId(null)).IgnoreArguments().Do(new GetCurrentUserIdDelegate(GetCurrentUserId));
}

Это работаетхорошо, но это кажется очень многословным.Разве нет более краткого способа сделать это?

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

Может быть, есть встроенный способ сделать это без необходимости определять делегатов?

1 Ответ

1 голос
/ 26 августа 2011

Передаваемый вами делегат должен иметь ту же сигнатуру, что и проверяемый метод, поэтому в вашем случае вы можете использовать Action<Action<int?>>:

mockRepository
    .Expect(r => r.GetCurrentUserId(null))
    .IgnoreArguments()
    .Do(new Action<Action<int?>>(act => { act(10); }));
...