2012-07-20 51 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