2015-11-12 2 views
2

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

Имея эти простые абстракции:

public interface ITaskFactory 
{ 
    void StartTask(Action action); 
} 

internal sealed class TaskFactory : ITaskFactory 
{ 
    public void StartTask(Action action) 
    { 
     Task.Factory.StartNew(action); 
    } 
} 

И этот класс для тестирования (упрощенно к этому случаю):

internal sealed class TriggerEventDecorator<TEvent> : ITriggerEvent<TEvent> where TEvent : IEvent 
{ 
    private readonly ITaskFactory _taskFactory; 
    private readonly Func<ITriggerEvent<TEvent>> _factory; 

    public TriggerEventDecorator(ITaskFactory taskFactory, Func<ITriggerEvent<TEvent>> factory) 
    { 
     _taskFactory = taskFactory; 
     _factory = factory; 
    } 

    public void Trigger(TEvent evt) 
    { 
     _taskFactory.StartTask(() => 
     { 
      _factory().Trigger(evt); 
     }); 
    } 
} 

И мой тест этого класса:

public class TriggerEventDecoratorTests 
{ 
    [Fact] 
    public void CanTriggerEventHandler() 
    { 
     var evt = new FakeEventWithoutValidation(); 
     Assert.IsAssignableFrom<IEvent>(evt); 

     var decorated = new Mock<ITriggerEvent<FakeEventWithoutValidation>>(MockBehavior.Strict); 
     decorated.Setup(x => x.Trigger(evt)); 

     var taskFactory = new Mock<ITaskFactory>(MockBehavior.Strict); 
     taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>())); 

     var decorator = new TriggerEventDecorator<FakeEventWithoutValidation>(taskFactory.Object,() => decorated.Object); 
     decorator.Trigger(evt); 

     taskFactory.Verify(x => x.StartTask(It.IsAny<Action>()), Times.Once); 
     decorated.Verify(x => x.Trigger(evt), Times.Once); // This line is not verified 
    } 
} 

В строка decorated.Verify(x => x.Trigger(evt), Times.Once); не проверена, она никогда не вызывается.

Как проверить, что это активировано в Action из _taskFactory?

+0

Вообще, когда есть больше чем один Mock в модульном тесте, это означает, что разработчик путается и теряется. Здесь, я думаю, это произошло. Что вы собираетесь тестировать? Если вы хотите протестировать 'TriggerEventDecorator', то почему он издевается? – Alireza

ответ

1

Вы не вызывали метод Func. Это проблема ... Для этого вам нужно будет использовать метод Callback.

Изменить следующие sertup:

taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>())); 

To:

taskFactory.Setup(factory => factory.StartTask(It.IsAny<Action>())) 
      .Callback<Action>((action) => action()); 
+0

Огромное вам спасибо, получив возможность использовать '.Callback (..)' now! Еще раз спасибо! :-) – janhartmann

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