Какой хороший способ писать модульные тесты для кода с защищенными объектами C # (с использованием NMock и фреймворка NUnit)

При написании модульных тестов для одного класса, содержащего другие объекты, что лучше всего использовать

имитировать объекты, чтобы избежать тестов, зависящих от других классов.

Пример 1:

public class MyClass
{
   protected MyObject _obj;

   public MyClass()
   {
       _obj = new MyObject();
   }

   public object DoSomething()
   {
      //some work
      _obj.MethodCall();
      //more work;
      return result;
   }
}

Я бы предпочел не раскрывать защищенное значение для создания модульного теста кода. Класс-оболочка будет

работают для тестирования, но есть ли способ лучше?

Пример 2:

public class MyClass
{

   public object DoSomething()
   {

      //some work
      MyObject obj = new obj(parameters);
      _obj.MethodCall(Method1);
      //more work;
      return result;
   }

   public int Method1()
   { ... }    

}

Подобно приведенному выше примеру, но объект ojbect создается в вызываемом мной методе.

Пример 3:

public class MyClass
{

   public object DoSomething()
   {

      //some work
      obj.MethodCall(Method1);
      //more work;
      return result;
   }

   public int MethodA()
   { ... }    

}

Есть ли способ протестировать MethodA, когда он используется только в качестве делегата?


person Community    schedule 20.11.2008    source источник


Ответы (2)


Я рекомендую вам взглянуть на внедрение зависимостей. Одна вещь - это использование имитационных объектов, но если вы не используете что-то вроде TypeMock, который в основном позволяет вам изменять код на лету, вы хотите иметь способ внедрять экземпляры, от которых зависит ваш класс, если вы хотите избавиться от зависимости. Поэтому в примерах 1 я бы предложил, чтобы вместо создания нового экземпляра MyObject в конструкторе вызывающий объект мог предоставить этот экземпляр. В этом случае вы легко сможете заменить его на макет или даже на заглушку.

person Brian Rasmussen    schedule 20.11.2008

Вы пробовали получить UTMyClass от MyClass?

person Paul Sonier    schedule 20.11.2008