統合テストでも WatiN と Cassini-dev を使用していますが、同様の問題に対処する必要がありました。私のセットアップ フィクスチャでは、cassini-dev を起動する前に構成をいじることができるように、Asp.Net Web アプリケーションをテスト フォルダー内の一時フォルダーにデプロイします。CI に Windsor を使用しているため、注入されたコンポーネントを構成レベルで変更できます。Unityでこれを実現することもできます。
参照しているサービスが Web サービスの場合は、コーディングしたインターフェイスを使用して Web サービスをモックアウトするだけです。
統合テストを実行するときに実行する手順は次のとおりです。
- 一時 Web ディレクトリを作成する
- Asp.Net Web アプリケーションを一時ディレクトリに発行します (これには MSBuild を使用します)。
- 一時データベースを展開します (MSbuild とデータベース プロジェクトを使用しますが、さまざまな方法で実行できます)。
- 一時メンバーシップ データベースを展開します (コードでこれを行う方法については、私のブログ投稿を参照してください)。
- デプロイされた Asp.Net Web アプリケーションの web.config を更新して、一時データベースを指すようにし、テストに関連するその他の設定を変更します。
- Cassini-Dev を使用して Web サイトを起動します。また、テストを実行する前にサイトが稼働していることを確認できるように、http 要求でサイトをヒットしました。
テストを実行します。
テストを実行したら、クリーンアップする必要があります。
- cassini-dev を停止
- 一時ホスティング フォルダーを削除します。
- 一時データベースを削除します。以前に失敗したテストの実行後に放置されていた古いデータベースを削除するために使用する 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