2011-01-15 13 views
3

私のasp.net Webアプリケーション用にいくつかのWebテスト(WatiN/Selenium + CassiniDev Webサーバー上)を書きたいと思います。Webテスト用のモックを行うには?

問題このような状況で何をすべきかわからないという問題が発生しました。 ユーザーがボタンをクリックしてサードパーティ製のサービスを呼び出すことができるページがあります。私のWebテストでは、常に静的な値(これらのテストケースではいくつかの値、他のテストケースでは他の値)を返すこのサービスのモックを作成したいと考えています。

どうすればいいですか?

現在、私はIoC/DIコンテナMicrosoft Unityを使用しています。私のページは、http://msdn.microsoft.com/en-us/library/ff664622%28v=pandp.50%29.aspxに記載されている方法で依存関係を取得します。

私の頭に浮かぶ唯一の解決策は、テストケースごとにweb.configにすべての依存関係を置き、テストのSetUpに必要なweb.configをコピーすることです。この解決策は完全に痛い!

アイデア?

答えて

0

ウェブサービスを模擬しようとしているようです。 Webサービスは、通常、これはあなたがWebサービスであることをふりを透過プロキシを作成するためのRealProxyから継承してモックを作成することができることを意味し、MarshalByRefObjectから継承します。

class Mock : RealProxy 
{ 
    public Mock() 
     : base(typeof(IStuff)) { } 

    public IStuff GetStuff() 
    { 
     return (IStuff)GetTransparentProxy(); 
    } 

    public override IMessage Invoke(IMessage msg) 
    { 
     IMethodCallMessage message = (IMethodCallMessage)msg; 

     // the message object provides the MethodInfo that was called 
     // as well as the arguments. 

     // <Insert logic here> 

     return new ReturnMessage(new NotImplementedException("comming soon to a test near you ..."), message); 
    } 
} 

私はNMock2がそれのモックのためのRealProxyを使用していますので、あなたがすべきbelieave Webサービスを模擬するためにそれを使用することができます。

2

私はWatiNとCassini-devを統合テストに使用しており、同様の問題に対処しなければなりませんでした。私のセットアップフィクスチャでは、自分のAsp.Net Webアプリケーションを私のテストフォルダの一時フォルダに配備しています。これにより、cassini-devを起動する前に設定を使いこなすことができます。私はウィンザーを私のCIに使って、設定されたコンポーネントを設定レベルで変更することができます。 Unityでこれを達成することもできます。

あなたが参照しているサービスがWebサービスの場合、コーディングしているインターフェイスを使用してWebサービスをモックアウトするだけです。ここで

は私の統合テストを実行しているときに私が取る手順は次のとおりです。

  1. tempディレクトリにAsp.Net Webアプリケーションを公開一時Webディレクトリ
  2. を作成します(私はこれを行うにはMSBuildのを使用します)
  3. 展開の一時データベース(のMSBuildを使用して、データベースプロジェクトが、いくつかの方法を行うことができる)
  4. 展開の一時会員データベース(コードでこれを行う方法についての私のblog postを参照)
  5. 配備されたAsp.Net Webアプリケーションのweb.configを更新して、一時データベースを参照し、テストに関連するその他の設定を変更します。
  6. Cassini-Devを使用してウェブサイトを起動します。私もhttp要求でサイトにヒットしたので、テストを実行する前にサイトが稼動していることを確認できます。

テストを実行します。

テストを実行した後、クリーンアップする必要があります。

  1. ストップカッシーニ-devの
  2. は一時データベースを削除します
  3. 一時ホスティングフォルダを削除します。以前に失敗したテストの実行後に残っていた古いデータベースを削除するために使用するSql Serverを照会できるSQL Server SMOオブジェクトを使用します。 http://www.pnpguidance.net/Post/UnityContainerUnityConfigurationSectionAppConfigWebConfig.aspx

    は、コード内のasp.netメンバーシップ・データベースの生成:http://bronumski.blogspot.com/2011/06/generating-creating-aspnet-application.html

    MSBuildの

    var properties = new Dictionary<string, string> 
    { 
        {"Configuration", isDebug ? "Debug" : "Release"}, 
        {"WebProjectOutputDir", tempHostingDirectory.FullName}, 
        {"DeployToDatabase", "true"}, 
        {"OutDir", Path.Combine(tempHostingDirectory.FullName, "bin\\")} 
    }; 
    
    using (var engine = new ProjectCollection(properties)) 
    { 
        engine 
         .LoadProject(<web project path>, "4.0") 
           .Build(new[] {"Build", "ResolveReferences", "_CopyWebApplication"}); 
    } 
    

    コードでユニティ構成セクションの使用をMSbuildを使用してウェブサイトを導入する方法


MSDNのProjectCollection:http://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.projectcollection.aspx

関連する問題