2016-03-10 4 views
0

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

IEnumerable<T> ExecuteReader<T>(
    string commandText, 
    Func<IDataRecord, T> returnFunc, 
    int timeOut = 30); 

ответ

0

Предполагая, что вы сгенерировали сборку подделок для интерфейса/класса в вопросе, то это зависит, если вы используете интерфейс (или виртуальный метод) для определения метода или только класса. Если интерфейс или виртуальный метод, вы можете использовать заглушку как

[TestMethod] 
    public void StubFuncTest() 
    { 
     StubITestReader stubClass = new StubITestReader(); 
     stubClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) => 
     { 
      int[] retVal = {12, 25, 15}; 
      return retVal; 
     }); 

     ITestReader reader = stubClass; 
     IEnumerable<int> curInt = reader.ExecuteReader<int>("testText", TestFunc); 
     foreach (var i in curInt) 
     { 
      Console.WriteLine(i); 
     } 
    } 

или если только стандартный метод, вы должны будете использовать подкладку (я бы посоветовал использовать первый вариант)

[TestMethod] 
    public void ShimFuncTest() 
    { 
     TestUnitTestClass tutClass = new TestUnitTestClass(); 
     using (ShimsContext.Create()) 
     { 
      ShimTestUnitTestClass shimClass = new ShimTestUnitTestClass(tutClass); 
      shimClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) => 
      { 
       int[] retVal = {12, 25, 15}; 
       return retVal; 
      }); 

      IEnumerable<int> curInt = tutClass.ExecuteReader<int>("testText", TestFunc); 
      foreach (var i in curInt) 
      { 
       Console.WriteLine(i);      
      } 
     } 
    } 

Добавление ответа на комментарий
Это немного проще для обычных методов. Использование заглушки, было бы что-то вроде

[TestMethod] 
    public void StubRegFuncTest() 
    { 
     StubITestReader stubClass = new StubITestReader(); 
     stubClass.ExecuteNonQueryStringInt32 = (str, timeout) => timeout * 2; 

     ITestReader reader = stubClass; 
     int curInt = reader.ExecuteNonQuery("testText"); 
     Console.WriteLine(curInt); 
     curInt = reader.ExecuteNonQuery("testText", 10); 
     Console.WriteLine(curInt); 
    } 

не столь-очевидного различия является шаблонным методом заключен в скобках в то время как нормальный метод просто лямбда-выражение и блок кода.

+0

Hi doobop, Спасибо за ваш ответ. первый ответ это работает для общего метода, но если я скажу нормальный метод, то в этом случае это не работает, как int ExecuteNonQuery (string commandText, int timeOut = 30); – Robin

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

  • Нет связанных вопросов^_^