2016-05-13 13 views
6

私たちはDALの機能テストのために、データベースをベースクラスにセットアップするために次のコードを使用しました。これは私たちにとって非常にうまく機能しています。ユニットテストプロジェクトでVisual Studio Database Projectを使用して、機能テスト用の空のデータベースをセットアップできますか?

/// <summary> 
/// Initializes the test class by creating the integration database. 
/// </summary> 
[TestInitialize] 
public virtual void TestInitialize() 
{ 
    DataContext = new DataContext(ConnectionString); 

    CleanupPreviousTestRunDatabases(); 

    if (DataContext.Database.Exists()) 
    { 
     DataContext.Database.Delete(); 
    } 

    DataContext.Database.Create(); 
    DataContext.Database.ExecuteSqlCommand(String.Format(Strings.CreateLoginCommand, DatabaseUserName, DatabasePassword)); 
    DataContext.Database.ExecuteSqlCommand(String.Format("CREATE USER {0} FOR LOGIN {0}", DatabaseUserName)); 
    DataContext.Database.ExecuteSqlCommand(String.Format("EXEC sp_addrolemember 'db_owner', '{0}'", DatabaseUserName)); 
} 

ただし、Entity Frameworkのを使用すると、セットアップデータベースのすべてのコンポーネントをせず、私たちはEFのDALモデルと実際のデータベース間の不一致をキャッチしたいと思います。

SSDTツール/ Visual Studioデータベースプロジェクトを使用してデータベース作業を行いますが、SQLユニットテストを書くことができます。これらのSQLユニットテストでは、データベースベースのセットアップと作成データベースプロジェクト自体にこれは私がやりたいことですが、私たちの他の機能テストライブラリからです。

私は、ライブラリを参照し、セットアップコードの一部を書きますが、私が探してはいることができます。

a)はどのように展開するために使用するデータベースプロジェクト提供していますか?

b)動的な名前のデータベースではなく、localdbを使用するなど、app.configではなく接続文字列をコードで指定するにはどうすればよいですか。 「

namespace Product.Data.Tests 
{ 
    using Microsoft.Data.Tools.Schema.Sql.UnitTesting; 
    using Microsoft.VisualStudio.TestTools.UnitTesting; 

    [TestClass] 
    public class FunctionalTest 
    { 
     [TestInitialize] 
     public virtual void TestInitialize() 
     { 
      SqlDatabaseTestClass.TestService.DeployDatabaseProject(); 
      SqlDatabaseTestClass.TestService.GenerateData(); 
     } 
    } 
} 

SQLユニットテストプロジェクト内のapp.configは、テストコードの一部を任意のバックそれを作成するために使用された元のデータベースプロジェクトへの参照、および逆コンパイルを含まず、それがどのように機能するかを見て、私はドン何かの指示を見てください。ソリューションにデータベースプロジェクトが1つしかないと想定していますか?

答えて

5

@Edエリオットが投稿のリンクからいくつかの方向で、私はこれを実現することができました。 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\Microsoft.SqlServer.Dac.dll(Visual Studio 2015)からMicrosoft.SqlServer.Dacをアセンブリ参照として追加する必要があります。これはSSDTツールの一部なので、以前のバージョンではパスが異なる可能性があります。

[TestClass] 
public class DatabaseTest 
{ 
    protected string DatabaseConnectionString = [email protected]"Data Source=(localdb)\v11.0; Integrated Security=True"; 
    protected DatabaseContext DatabaseContext; 
    protected string DatabaseName = $"UnitTestDB_{Guid.NewGuid().ToString("N").ToUpper()}"; 

    public TestContext TestContext { get; set; } 

    [TestInitialize] 
    public virtual void TestInitialize() 
    { 
     var instance = new DacServices(DatabaseConnectionString); 
     var path  = Path.GetFullPath(Path.Combine(TestContext.TestDir, 
             @"..\..\..\Build\Database\Database.dacpac")); 

     using (var dacpac = DacPackage.Load(path)) 
     { 
      instance.Deploy(dacpac, DatabaseName); 
     } 

     DatabaseContext = new DatabaseContext(DatabaseConnectionString); 
    } 

    [TestCleanup] 
    public virtual void TestCleanup() 
    { 
     DeleteDatabase(DatabaseName); 
    } 
} 

次に、単体テストプロジェクトで機能テストに使用する方法。他の人に

[TestClass] 
public class CustomerTypeTests : DatabaseTest 
{ 
    private CustomerType customerType; 

    [TestInitialize] 
    public override void TestInitialize() 
    { 
     base.TestInitialize(); 

     customerType = new CustomerType 
         { 
          Name = "Customer Type" 
         }; 
    } 

    [TestMethod] 
    public void AddOrUpdateCustomerType_ThrowExceptionIfNameIsNull() 
    { 
     ExceptionAssert.Throws<ArgumentNullException>(() => DatabaseContext.AddOrUpdateCustomerType(customerType)); 
    } 
} 

ちょうどノートは、セットアップもするべきあなたのBuild Dependenciesあなたのユニットテストプロジェクトは、それが最初に構築されて確実に、データベースプロジェクトに依存し、正しいdacpacファイルを生成するように。

これは、Entity Frameworkのモデルに基づいたデータベースではなく、期待されるSQL構造(特にデフォルトの制約、インデックスなど)が不足している真のデータベースではありませんか?データベースの要素。私たちのDAL層では、これは私たちのために不可欠です。

5

あなたが持っているプロセスはちょっと複雑すぎると思います。

  • が解決
  • 展開私はテスト

ために私のdevのインスタンス

  • 実行する必要があり、各dacpacにビルドします。

    は、私がSSDTでユニットテストのために何をすべきかですプロジェクトを展開するにはいくつかの方法があります:

    • 各プロジェクトの「プロファイルを公開」と
    • は、プロジェクトを右クリックし、[dacpacの公開を行うにはPowerShellスクリプトを使用します(またはテストの初期化のコードでそれを行う)
    • を公開選択することで実行を作成します。それはdacpac(プロジェクト)の公開やって、あなたのテストを実行する展開されたら

    は、コードやスクリプトから非常に簡単です、次のいずれかを実行します

    • コールsqlpackage。あなた
    • は、あなたが自分自身を公開するコントロールしている場合、あなたはあなたがこれを使用してdeplolyとき、それはあなたに多くの制御プラスを与えるdacfxのAPIのデプロイ(http://blogs.msmvps.com/deborahk/deploying-a-dacpac-with-dacfx-api/

    を行うために使用するためにそれを行うためのexeファイル他の環境で使用するのと同じデプロイメントシステムをテストします(dacpacを使用してデプロイすることを前提としています)。

  • +0

    ガイダンスとハイパーリンクをありがとう。私はこの仕事をすることができました。 –

    関連する問題