2014-09-26 1 views
6

Как издеваются следующий метод:Moq. Выполните действия, заданные в качестве параметра

public class TimeService : ITimeService 
{ 
    public void SetDelyEvent(int interval, bool reset, Action action) 
    { 
     var timer = new Timer {Interval = interval, AutoReset = reset}; 
     timer.Elapsed += (sender, args) => action(); 
     timer.Start(); 
    } 
} 

Я хочу, чтобы вызвать данное действие.

var stub = new Mock<ITimeService>(); 
stub .Setup(m => m.SetDelyEvent(100, false, ACTION)); 
+0

Вы желая Мероприятие проходило в казнены сразу же, как только вызов функции выполняется только один раз, или вы пытаетесь «воссоздать» поведение TimeService внутри Moq? –

+0

Я хочу вызвать действие сразу же. Это действие является частным методом в моем SUT. Я должен назвать это, чтобы произвести результат. –

ответ

9

Просто используйте метод .Callback( для вызова метода, который будет работать, когда ваш макет выполняется, ваша функция обратного вызова может быть передана в акции, которая была передана в исходный метод, все, что вам нужно сделать, это выполнить Действие в вашем обратном вызове.

var stub = new Mock<ITimeService>(); 
    stub .Setup(m => m.SetDelyEvent(It.IsAny<int>(), It.IsAny<bool>(), It.IsAny<Action>())) 
     .Callback((int interval, bool reset, Action action) => action()); 
+0

Отлично. Только это ACTION должно быть 'It.IsAny ()' –

+0

Thats fine, это не влияет на решение, я использовал только 'ACTION', потому что я думал, что это переменная, которую вы объявили. Код будет работать так же хорошо, как и m.SetDelyEvent (It.IsAny (), It.IsAny (), It.IsAny ()) ', вы все равно можете использовать один и тот же обратный вызов. –

+0

@MiroslavPopov Я обновил код, чтобы использовать любые свойства вместо определенных, которые вы использовали в вашем исходном примере. –

Смежные вопросы