Подтвердить что ты не робот

Частичное издевательство над классом с Moq

Я хочу высмеять только метод GetValue следующего класса, используя Moq:

public class MyClass
{
    public virtual void MyMethod()
    {
        int value = GetValue();
        Console.WriteLine("ORIGINAL MyMethod: " + value);
    }

    internal virtual int GetValue()
    {
        Console.WriteLine("ORIGINAL GetValue");
        return 10;
    }
}

Я уже немного читал, как это должно работать с Moq. Решение, которое я нашел в Интернете, это использовать свойство CallBase, но это не работает для меня.

Это мой тест:

[Test]
public void TestMyClass()
{
     var my = new Mock<MyClass> { CallBase = true };
     my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999);
     my.Object.MyMethod();
     my.VerifyAll();
 }

Я бы ожидал, что Moq использует существующую реализацию MyMethod и вызывает метод mocked, в результате чего получается следующий результат:

ORIGINAL MyMethod: 999
MOCKED GetValue

но то, что я получаю:

ORIGINAL GetValue
ORIGINAL MyMethod: 10

а затем

Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue()

У меня возникло чувство, что я совершенно неправильно понял. Что мне здесь не хватает? Любая помощь будет оценена

4b9b3361

Ответ 1

ОК, я нашел ответ на этот вопрос в другом вопросе: Как откусить внутренний метод класса?. Таким образом, это дубликат и может быть закрыт.

Тем не менее, здесь решение: просто добавьте эту строку в Assembly.config проекта, который вы хотите проверить:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq

Ответ 2

Вы пытались указать Подтверждаемый:

my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable();