3

asp.net 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 に配置し、テストのセットアップで必要な web.config をコピーすることです。この解決策は完全に痛いです!

何か案は?

4

2 に答える 2

2

統合テストでも WatiN と Cassini-dev を使用していますが、同様の問題に対処する必要がありました。私のセットアップ フィクスチャでは、cassini-dev を起動する前に構成をいじることができるように、Asp.Net Web アプリケーションをテスト フォルダー内の一時フォルダーにデプロイします。CI に Windsor を使用しているため、注入されたコンポーネントを構成レベルで変更できます。Unityでこれを実現することもできます。

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

統合テストを実行するときに実行する手順は次のとおりです。

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

テストを実行します。

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

  1. cassini-dev を停止
  2. 一時ホスティング フォルダーを削除します。
  3. 一時データベースを削除します。以前に失敗したテストの実行後に放置されていた古いデータベースを削除するために使用する Sql サーバーにクエリを実行できるようにする Sql サーバー SMO オブジェクトを使用します。

コードでMSbuildを使用して Web サイトをデプロイする方法

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"});
}

Unity 構成セクションの使用法: http://www.pnpguidance.net/Post/UnityContainerUnityConfigurationSectionAppConfigWebConfig.aspx

コードで asp.net メンバーシップ データベースを生成する: http://bronumski.blogspot.com/2011/06/generating-creating-aspnet-application.html

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

于 2011-08-01T10:19:41.110 に答える
0

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

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 を使用していると思いますので、代わりにそれを使用して Web サービスをモックできるはずです。

于 2011-01-31T09:14:07.460 に答える