2015-11-20 3 views
3

Я не могу настроить обратный вызов защищенного метода с использованием Moq (v.4.2).Как настроить обратный вызов защищенного метода с помощью Moq?

Код выглядит следующим образом:

public abstract class AbstractClass 
{ 
    protected abstract void OneProtectedMethod(); 
} 

public class OneClass : AbstractClass 
{ 
    protected override void OneProtectedMethod() 
    { 
     Console.WriteLine("Hello"); 
    } 

    public void DoMethod() 
    { 
     OneProtectedMethod(); 
    } 
} 

[Test] 
public void should_call_protected_method() 
{ 
    var mock = new Mock<OneClass>(); 

    mock.Protected().Setup("OneProtectedMethod").Callback(() => Console.WriteLine("Goodbye")); 

    var o = new OneClass(); 

    o.DoMethod(); 

    mock.Protected().Verify("OneProtectedMethod", Times.Once()); 
} 

ли я делаю что-то неправильно здесь?

Спасибо.

+0

Тест ничего не делает, нет никакой связи между макетом и экземпляром '' 'OneClass'' в' '' 'Act'''. Чего вы пытаетесь достичь? – dee

+0

Я хочу проверить, был ли метод вызван на объект (и многое другое, попытайтесь измерить/вычислить что-то, поэтому Callback). Есть ли способ сделать это? – Marimout

+0

Конечно, есть способ. См. Мой ответ на примере. Проблема в вашем тесте заключается в том, что у вас нет никакой связи между тестируемым классом и макетом. Оба они независимы. Поэтому, когда вы вызываете '' 'DoMethod'', он не может влиять на макет. Таким образом, вы правильно настроили защиту, но тогда макет не используется. HTH – dee

ответ

0

Ваша настройка защищенного метода работает хорошо, но это должно быть каким-то образом связано с тестируемым классом. Представьте себе какой-то класс, как следующий. Он имеет зависимость от OneClass, и эту зависимость можно высмеять в модульном тесте.

public class Master 
{ 
    // Master hes dependency on OneClass 
    private readonly OneClass _dependency; 

    public Master(OneClass dependency) 
    { 
     _dependency = dependency; 
    } 

    public bool DoSomething() 
    { 
     // ... some code 
     // dependency is used here 
     _dependency.DoMethod(); 
     // ... some code 

     return true; 
    } 
} 

Тогда тест может выглядеть примерно следующим образом.

[TestMethod] 
public void DoSomething_WhenCalled_ReturnsTrue() 
{ 
    // Arrange 
    var mock = new Mock<OneClass>(); 
    mock.Protected().Setup("OneProtectedMethod").Callback(() => Debug.WriteLine("Goodbye")); 
    var master = new Master(mock.Object); 

    // Act 
    master.DoSomething(); 

    // Assert 
    // ... 
} 

Здесь издевались будет использоваться версия OneProtectedMethod метода. Таким образом, на выходе будет написан только текст Goodbye, реальная реализация будет издеваться. НТН.

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