У меня есть служба, которая вызывает метод Invoke для разных классов на основе атрибута класса, найденного с помощью отражения. Я хочу проверить, что создан правильный класс и вызван метод.
Служба:
private void InvokeCorrectClass(string message)
{
//find type from cache of types based on info in message
//_cacheTypes is Dictionary<Type, string>
var type = _cacheTypes.First(p=>p.Value == msg.MessageType).Key;
var instance = Activator.CreateInstance(type);
var invokeMethod = type.GetMethod("Invoke");
invokeMethod.Invoke(instance, new object[] {msg, messageId});
}
Конечно, я опускаю некоторые проверки на ноль и обработку ошибок ....
Класс 1:
public async Task Invoke(object message, int messageId)
{
//process MessageType 1
}
Класс 2:
public async Task Invoke(object message, int messageId)
{
//process MessageType 2
}
Я знаю, что код работает правильно, так как я нажимаю правильный код, используя точки останова, но я пытаюсь использовать Moq и XUnit для автоматизации создания правильного классаи вызвал, и мне совсем не повезло.
Кроме того, ни у класса 1, ни у класса 2 нет конструкторов без параметров и много зависимостей. Я попытался добавить конструктор без параметров, чтобы смоделировать его с помощью установки:
_testModule.MessageProcessorMock.Setup(i => i.Invoke(It.IsAny<object>, It.IsAny<int>()))
.Returns<object, int>((msg, messageId) =>
{
msgId = messageId;
msgPassedOn = msg;
return Task.CompletedTask;
});
, но он никогда не вызывался.