1

Team Foundation Service で自動化されたビルドとテストをセットアップしようとしていますが、テストを Azure データベースに接続できないため、テストが失敗し続けます。

ビルドはうまくいきますが、サイトをデータベースに接続させるテストはすべて失敗します。Azure にデータベースをセットアップし、それを Azure サイトに関連付けました。データベースに許可された IP アドレスを構成してローカル マシンを含め、Azure サービスが接続できるように設定しました。サイトは私のマシン上でローカルに機能し、Azure Web サイトに公開された場合にも機能し、両方の場所から Azure データベースに問題なく接続します。

ソース管理にTeam Foundation Service ( https://tfs.visualstudio.com/ ) を使用しており、Team Foundation Service で自動ビルドをセットアップし、それらのビルドから Azure への継続的デプロイを行っています。その他のすべての側面、ソース管理、チェックインからのビルド、Azure サイトへのビルドのデプロイは正常に機能しますが、テストに合格するものはありません。

エラー メッセージ:

コードが最初の EF のプロジェクトの場合:

テスト メソッド MySite.Tests.Controllers.HomeControllerTest.Index が例外をスローしました: System.Data.SqlClient.SqlException: CREATE DATABASE 権限がデータベース 'master' で拒否されました。

データベースが最初の EF のプロジェクト:

テスト メソッド tfstest4.Tests.Controllers.HomeControllerTest.Index が例外をスローしました: System.InvalidOperationException: 'TestDbContext' という名前の接続文字列がアプリケーション構成ファイルに見つかりませんでした。

(接続文字列は存在し、ローカルでも、Azure にデプロイされた後でも問題なく動作することに注意してください)

データベース アクセスが必要な Team Foundation Service で単体テストを実行する際のアドバイスをいただければ幸いです。

4

1 に答える 1

1

自動化された単体テストを実行している場合は、Entity Frameworkをテストする理由がないため、データベースへの依存関係を削除することをお勧めします。私が個人的に行うことは、データベースレイヤーを何らかの形式のリポジトリインターフェイスの背後に隠し、何らかの形式の依存性注入戦略またはファクトリパターンを使用して、テストの実行時にいくつかのモック実装を提供することです。

自動統合テストも実行している場合は、データベースを使用する方が理にかなっている場合があります。接続文字列がテストプロジェクトの構成に存在しないように見える場合があります。どの接続文字列を使用するかをEFにどのように指示するかはわかりませんが、設定エントリへの直接の依存関係を回避することをお勧めします。

EF Code Firstを使用する場合は、DbContextクラスの基本コンストラクターへの引数として接続文字列を指定できます。たとえば、接続文字列を静的プロパティに入れて、データベースコンテキストをインスタンス化するときにフェッチすることができます

public static class MyConnectionStringProvider
{
    public static string ConnectionString{ get; set; }
}

public class MyDbContext : DbContext
{
    public MyDbContext() 
       : base(MyConnectionStringProvider.ConnectionString)
    { }
}

これで、アプリの起動とテストのセットアップルーチンのある時点で、接続文字列を設定できます。これにより、使用する接続文字列を制御できます。

たとえば、azure Webサイトを実行している場合、通常、Application_Startメソッドで、app.configファイルではなくロール構成から接続文字列を取得します。

MyConnectionStringProvider.ConnectionString = 
     RoleEnvironment.GetConfigurationSettingValue("MyConnectionString")

テストクラスでは、まったく異なることを行うことができます

MyConnectionStringProvider.ConnectionString = "[connectionstring to my test database]"

最後に、テストを実行しているコンピューターのSQL Azureサーバーファイアウォールに例外を追加する必要がある場合があるため、整理する必要のあるファイアウォールの癖がある可能性があります。必要であることが判明した場合は、MSサポートに連絡します。

于 2013-02-25T12:16:23.883 に答える