0

アプリケーションの統合/回帰テストスイートを実行する必要があります。アプリケーションは、1日の時間帯によって動作が異なるはずです。他のアプリがシステム時刻に依存しているため、システム時刻を変更できません。この目的のために、DateTime.Nowをモックしたいと思います。ただし、メインメソッドにモックを入れると、例外がスローされました。同じアプリケーションのnunitテストでモックを使用すると、正常に機能します。typemockは、単体テストのコンテキストでのみ使用できますか?とにかく、モックを有効にしてソリューションを実行できますか?TMockRunner.exeでもソリューションを実行しましたが、同じ問題が発生しました。

ありがとう!

Travisが@TravisIlligに言及したメソッドを使用して実行すると、このエラーが表示されます。ラッパーのコードは次のとおりです。

 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

どんな助けでもありがたいですありがとう!

4

1 に答える 1

0

Typemock Isolator の一般的な用途は、単体テストまたは小規模なテスト環境のコンテキスト内です。プロセスで Isolator (または NCover などの他のプロファイラーベースの製品) を実行すると、0 以外のレベルのオーバーヘッドが発生するため、通常はそうしたくないでしょう。

ただし、通常のプロセスで Isolator を実際に実行したい場合は、いくつかの完全なエッジ ケースがあり、それは可能です。

これは、たとえば、Windows サービスに対してこれを行う方法を説明する、しばらく前に書いた記事です。

基本的なアルゴリズムは次のとおりです。

  • Typemock Isolator を有効にします (プロセスにプロファイリング フラグを設定するか、TMockRunner.exe を介して実行します)。
  • 期待値を設定します (これは、DateTime.Now またはモックアウトしたいものをモックする場所です)。
  • アプリケーションの起動を終了し、通常どおり実行します。

最初のステップは簡単です。単体テスト環境で実行するのと同じです。難しいのは2番目のステップです。これは、ある種の「ラッパー」、またはアプリケーションの残りの部分が開始される前に実行される何かが必要であることを意味し、期待を設定します。これは通常、テスト セットアップ メソッドまたは「arrange-act-assert」単体テストの「arrange」部分で発生します。この例は私の記事で見ることができます。

繰り返しますが、パフォーマンスについて警告します。あなたが言っているように、テスト環境でこのようなことをするのはおそらく問題ありませんが、本番環境ではそうしないと思います。


プログラムと表示されているエラーに関する特定のメモ:

私はそれの複製をセットアップしようとしましたが、他のものをモックすることはできましたが、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 サポートに連絡して、状況を説明してください。彼らは手伝うのが上手です。必ず複製 (問題を示す単純なコンソール アプリなど) を送信してください。より迅速で適切な応答が得られます。

于 2012-07-23T16:38:47.260 に答える