Я занимаюсь тестированием модулей в эти дни, поэтому несите меня, если я не пойму некоторые основы.Убедитесь, что этот метод вызван в действии.
Имея эти простые абстракции:
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
?
Вообще, когда есть больше чем один Mock в модульном тесте, это означает, что разработчик путается и теряется. Здесь, я думаю, это произошло. Что вы собираетесь тестировать? Если вы хотите протестировать 'TriggerEventDecorator', то почему он издевается? – Alireza