2012-07-20 49 views
0

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

谢谢!

我看到这个错误,当我运行使用特拉维斯提到 @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 

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

回答

0

Typemock Isolator的典型用法是在单元测试或小型测试环境的上下文中。在一个进程中运行Isolator(或者其他基于Profiler的产品,如NCover)的开销非零,因此您通常不希望这样做。

但是,如果您确实需要在常规流程中运行隔离器,那么存在一些总边界情况,这是可能的。

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

基本算法成立:

  • 启用Typemock隔离器(或者通过设置在处理概要分析标志或通过TMockRunner.exe运行的东西)。
  • 建立你的期望(这是你嘲笑DateTime.Now或任何你想要嘲笑的地方)。
  • 让应用程序完成启动并正常运行。

第一步很简单 - 就像在单元测试环境中运行一样。这是第二步,可能很困难。这意味着你需要有一些“包装器”或者其他应用程序允许启动之前运行的东西,这会设置你的期望。这通常发生在测试设置方法或“编排 - 行为 - 断言”单元测试的“安排”部分。 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.Now,您将再次得到异常。

我确实证实了在单元测试环境中嘲笑DateTime.Now 确实有效。所以在单元测试环境中一定有一些特殊的东西,尽管我不知道是什么。

找出这种差异比可以在这里处理的东西更深入一点。 您应该联系Typemock支持并解释这种情况。他们对帮助很好。一定要给他们一份复制品(例如,一个简单的控制台应用程序显示的问题),你会得到更快/更好的回应。

+0

谢谢特拉维斯!我用了类似的东西。 Mine是一个控制台应用程序,并且我编写了一个包装控制台应用程序,它执行期望设置等级。程序 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时,它会抛出异常。 – user1532105 2012-07-24 20:54:27

+0

您应该更新您的问题以包含异常信息和包装控制台应用程序。很难排除故障或提供没有所有信息的建议。 – 2012-07-24 22:00:09