TypeMock в наборе интеграционных/регрессионных тестов

Мне нужно запустить набор интеграционных/регрессионных тестов для нашего приложения, и приложение должно вести себя по-разному в разное время дня. Я не могу изменить системное время, так как от него зависят другие приложения. Я хотел бы издеваться над DateTime.Now для этой цели. Однако, когда я помещал насмешку в основной метод, возникали исключения. Когда я использую mocking в тесте nunit для того же приложения, он работает нормально. Можно ли использовать typemock только в контексте модульного теста? Могу ли я в любом случае запустить решение с включенным издевательством? Я также запускал решение через TMockRunner.exe, но у меня была та же проблема.

Спасибо!

Я вижу эту ошибку, когда запускаю метод, который Трэвис упомянул @Travis Illig. Код для оболочки:

 class Program
  {
    static void Main(string[] args)
    {
      ExpectationsSetup();

      ConsoleApplication2.Program.Main(args);
    }

    public static void ExpectationsSetup()
    {
      Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2010, 1, 2));
    }
  }
I see the following error:

Unhandled Exception: TypeMock.TypeMockException:
*** No method calls found in recording block. Please check:
 * Are you trying to fake a field instead of a property?
 * Are you are trying to fake an unsupported mscorlib type? See supported types
here: http://www.typemock.com/mscorlib-types
   at gt.a(c0 A_0, Boolean A_1)
   at bg.a(Boolean A_0)
   at dt.b(Boolean A_0)
   at i2.b(Boolean A_0)
   at i2.a(Object A_0, Boolean A_1, Func`1 A_2, Action A_3, Action A_4, Action A
_5, Boolean A_6)
   at i2.b(Object A_0)
   at TypeMock.ArrangeActAssert.ExpectationEngine`1.a(TResult A_0)
   at ConsoleApplication2Mock.Program.ExpectationsSetup() in C:\Users\shvenkat\D
ocuments\Visual Studio 2010\Projects\ConsoleApplication2\ConsoleApplication2Mock
\Program.cs:line 22
   at ConsoleApplication2Mock.Program.Main(String[] args) in C:\Users\shvenkat\D
ocuments\Visual Studio 2010\Projects\ConsoleApplication2\ConsoleApplication2Mock
\Program.cs:line 14

Любая помощь будет оценена Спасибо!


person user1532105    schedule 20.07.2012    source источник


Ответы (1)


Обычно Typemock Isolator используется в контексте модульного теста или небольшой среды тестирования. Существует ненулевой уровень накладных расходов, связанных с запуском Isolator (или любого другого продукта на основе профилировщика, такого как NCover) в процессе, поэтому обычно вы не хотите этого делать.

Тем не менее, есть несколько крайних случаев, когда вы действительно хотите запустить Isolator в обычном процессе, и это возможно.

Вот статья, которую я написал какое-то время назад объясняли, как это можно сделать, например, со службой Windows.

Основной алгоритм выполняется:

  • Включите Typemock Isolator (либо установив флаги профилирования процесса, либо запустив его через TMockRunner.exe).
  • Настройте свои ожидания (здесь вы издеваетесь над DateTime.Now или чем-то еще, что вы хотите издеваться).
  • Дайте приложению завершить запуск и работать в обычном режиме.

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

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


Особое примечание о вашей программе и ошибке, которую вы видите:

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

Например, попробуйте это в своей оболочке:

class Program
{
  static void Main(string[] args)
  {
    ExpectationsSetup();

    ConsoleApplication2.Program.Main(args);
  }

  public static void ExpectationsSetup()
  {
    // Mock something OTHER than DateTime.Now - this mocks
    // the call to your wrapped application.
    Isolate
      .WhenCalled(() => ConsoleApplication2.Program.Main(null))
      .DoInstead(ctx => Console.WriteLine("faked!"));
  }
}

Запустив эту оболочку через TMockRunner.exe, вы на самом деле заставите макет работать. Однако, переключив его обратно на DateTime.Now, вы снова получите исключение.

Я убедился, что имитация DateTime.Now в среде модульного тестирования действительно работает. Так что должно быть что-то особенное в среде модульного тестирования, хотя я не знаю что.

Выяснение этой разницы немного более глубоко, чем то, что можно обработать здесь. Вам следует связаться со службой поддержки Typemock и объяснить ситуацию. Они очень хорошо помогают. Обязательно отправьте им репродукцию (например, простое консольное приложение, показывающее проблему), и вы получите более быстрый/лучший ответ.

person Travis Illig    schedule 23.07.2012
comment
Спасибо Трэвис! Я использовал нечто подобное. У меня консольное приложение, и я написал консольное приложение-оболочку, которое выполняет настройку ожиданий и т. д. class Program { static void Main(string[] args) { ExpectationsSetup(); ConsoleApplication2.Program.Main(аргументы); } public static void ExpectationsSetup() { Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2010, 1, 2)); } }. Однако он выдает исключения, когда я запускаю TMockRunner. - person user1532105; 25.07.2012
comment
Вероятно, вам следует обновить свой вопрос, включив в него информацию об исключении и консольное приложение-оболочку. Трудно устранять неполадки или давать советы без всей информации. - person Travis Illig; 25.07.2012