【问题标题】:TypeMock in an integration/regression test suite集成/回归测试套件中的 TypeMock
【发布时间】:2012-07-20 20:31:16
【问题描述】:

我需要为我们的应用程序运行一个集成/回归测试套件,并且该应用程序应该在一天中的不同时间表现不同。我无法更改系统时间,因为其他应用程序依赖它我想为此模拟 DateTime.Now。但是,当我将模拟放在 main 方法中时,抛出了异常。当我在同一应用程序的 nunit 测试中使用模拟时,它工作正常。 typemock 只能在单元测试的上下文中使用吗?无论如何我可以在启用模拟的情况下运行解决方案吗? 我也通过 TMockRunner.exe 运行了解决方案,但遇到了同样的问题。

谢谢!

我在使用 Travis 提到的方法运行时看到此错误 @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

任何帮助将不胜感激 谢谢!

【问题讨论】:

    标签: testing integration-testing regression-testing typemock


    【解决方案1】:

    Typemock Isolator 的典型用途是在单元测试或小型测试环境的上下文中。在进程中运行 Isolator(或任何其他基于分析器的产品,如 NCover)会产生非零水平的开销,因此您通常不希望这样做。

    但是,当您确实希望在常规进程上运行 Isolator 时,总有一些极端情况,这是可能的。

    Here's an article I wrote from a while back explaining how you can do this to a Windows Service, for example.

    基本算法成立:

    • 启用 Typemock Isolator(通过在进程上设置分析标志或通过 TMockRunner.exe 运行事物)。
    • 设置您的期望(这是您模拟 DateTime.Now 或其他任何您想模拟的地方)。
    • 让应用程序完成启动并正常运行。

    第一步很简单——就像您在单元测试环境中运行它一样。这是可能很困难的第二步。这意味着您需要有某种“包装器”或在允许启动应用程序的其余部分之前运行的东西,这将建立您的期望。这通常发生在测试设置方法或“arrange-act-assert”单元测试的“arrange”部分。 You'll see an example of this in my article.

    再次,我会警告您有关性能的信息。在您提到的测试环境中做这样的事情可能很好,但我认为我不会在生产环境中这样做。


    关于您的程序和您看到的错误的具体说明:

    我尝试设置它的复制品,虽然我能够模拟其他东西,但我无法让 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。现在,您将再次遇到异常。

    我确实验证了在单元测试环境中模拟 DateTime.Now 确实有效。所以单元测试环境肯定有什么特别之处,虽然我不知道是什么。

    找出这种差异比在这里可以处理的东西更深入一点。 您应该联系 Typemock 支持人员并说明情况。他们非常乐于提供帮助。请务必向他们发送副本(例如,显示问题的简单控制台应用程序),您将获得更快/更好的响应。

    【讨论】:

    • 谢谢特拉维斯!我用过类似的东西。我的是一个控制台应用程序,我编写了一个包装控制台应用程序,它执行期望设置等类 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)); } }。但是,当我通过 TMockRunner 运行时它会引发异常..
    • 您可能应该更新您的问题以包含异常信息和您的包装控制台应用程序。没有所有信息,很难排除故障或提供建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多