2012-06-13 2 views
10

Я хочу издеваться только 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() 

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

+0

возможно дубликат [Когда насмешливый класса с Moq, как я могу CallBase только за конкретные методы?] (http://stackoverflow.com/questions/2822947/when-mocking-a-class-with-moq-how-can-i-callbase-for-just-specific-methods) – StriplingWarrior

+0

Если вы сделаете свой ' Метод GetValue 'public' вместо' internal' работает. Я не знаю, почему, возможно, это ограничение динамического прокси-сервера замка, или это ошибка Moq, или это предполагаемое поведение. В любом случае, если вы оставите это как внутреннее, вы не сможете поместить свой производственный код в другую сборку, если вы не используете InternalVisibleTo. – nemesv

+0

Возможный дубликат [Проверка метода был вызван] (http://stackoverflow.com/questions/1980108/verifying-a-method-was-called) – nemesv

ответ

5

ОК, я нашел ответ на это другой вопрос: How to Mock the Internal Method of a class?. Таким образом, это дубликат и может быть закрыт.

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

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

К сборке test.config теста? Или в класс, тестируемый Assembly.config? – Nick

+0

Класс, который тестируется! Я отредактировал свой ответ и уточнил это. – Fabian

0

ли вы пытаетесь указать Проверяемость:

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

не пробовал, но не имеет значения – Fabian

Смежные вопросы