Как вы проверяете, что метод, который использует отражение для вызова метода в разных классах, вызывает правильный класс - PullRequest
0 голосов
/ 11 октября 2019

У меня есть служба, которая вызывает метод 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;
                });

, но он никогда не вызывался.

...