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

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

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

Пример 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()
   { ... }    

}

Аналогично приведенному выше примеру, но объект создается в методе, который я вызываю.

Пример 3:

public class MyClass
{

   public object DoSomething()
   {

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

   public int MethodA()
   { ... }    

}

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

Ответы [ 2 ]

1 голос
/ 21 ноября 2008

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

0 голосов
/ 21 ноября 2008

Вы пытались получить UTMyClass из MyClass?

...