Частичное издевательство над классом с 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()
У меня возникло чувство, что я совершенно неправильно понял. Что мне здесь не хватает?
Любая помощь будет оценена
Ответы
Ответ 1
ОК, я нашел ответ на этот вопрос в другом вопросе: Как откусить внутренний метод класса?. Таким образом, это дубликат и может быть закрыт.
Тем не менее, здесь решение:
просто добавьте эту строку в Assembly.config
проекта, который вы хотите проверить:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
Ответ 2
Вы пытались указать Подтверждаемый:
my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable();