2015-07-17 1 views
1

У меня есть Общественный метод тестирования, который называет общественную Child-метод:Метод Затенение Использование NSubstitute в NUnit

Метод Ребенок имеет дополнительный параметр:

public class ChildClass : IChildClass 
{ 
     public bool MyChildMethod(string param1, string param2, string param3 = null) 
    { 
    ... 
    } 
} 

Методы Родительские вызывающую ребенка как :

_childClassInstance.MyChildMethod("param1","param2") 

Когда я запускаю мой UnitTestCase, я хочу, чтобы заменить его любит:

_childClassInstance.MyChildMethod("param1","param2","param3") 

Как это сделать?

+0

Почему вы хотите заменить поведение метода к неожиданному поведению? Если родительский класс не будет вызывать метод таким образом, заменитель будет бесполезен .... –

+0

Необязательный параметр здесь - фактически DbSession (инъекция зависимостей), который мне нужно отменить DB-изменения после того, как мой тестовый файл казнены. –

+2

Итак, почему бы вам не решить эту проблему с помощью 'Teardown'? (Класс Test имеет ссылку на' _childClassInstance', а затем в 'Teardown' выполняет откат) –

ответ

0

Использование nsubstitute вы можете затенять вызов общественного метода следующим путем:

mockObj.When(x => mockObj.MyChildMethod(Arg.Any<string>(), Arg.Any<string>(), null)).Do(MyMethod) 

private void MyMethod(CallInfo callInfo) 
     { 
      mockObj.MyChildMethod((string)callInfo.Args()[0],(string)callInfo.Args()[1], "param3"); 
     } 
2

Короткий ответ заключается в том, что не существует способа издеваться над поведением частного метода и, как правило, вы не хотите относиться к частным методам в модульном тестировании, поскольку они считаются «деталями реализации».

Если этот метод был общедоступным, используя фреймворк Moq, вы могли бы сделать следующее.

Mock<MyChildClass> mockChildClass = new Mock<MyChildClass>(); 
mockChildClass.Setup(x => x.MyChildMethod("param1", "param2", "param3"));