Я хочу издеваться только GetValue
метод следующего класса, используя Moq:Частичное насмешливый класса с 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
и вызывает высмеивал метод, в результате чего следующий вывод:
ORIGINAL MyMethod: 999
MOCKED GetValue
, но это то, что я получить:
ORIGINAL GetValue
ORIGINAL MyMethod: 10
, а затем
Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue()
У меня возникло ощущение, что я совершенно неправильно понял. Что мне здесь не хватает? Любая помощь будет оценена
возможно дубликат [Когда насмешливый класса с Moq, как я могу CallBase только за конкретные методы?] (http://stackoverflow.com/questions/2822947/when-mocking-a-class-with-moq-how-can-i-callbase-for-just-specific-methods) – StriplingWarrior
Если вы сделаете свой ' Метод GetValue 'public' вместо' internal' работает. Я не знаю, почему, возможно, это ограничение динамического прокси-сервера замка, или это ошибка Moq, или это предполагаемое поведение. В любом случае, если вы оставите это как внутреннее, вы не сможете поместить свой производственный код в другую сборку, если вы не используете InternalVisibleTo. – nemesv
Возможный дубликат [Проверка метода был вызван] (http://stackoverflow.com/questions/1980108/verifying-a-method-was-called) – nemesv