前回の続きです。
前回のエントリに対して、@ahiru_sp さんからアドバイスいただきました。
これ、DatabaseTestService の派生クラスを作って、引数ありのDeployDatabaseProject呼ぶのが正攻法?かと思ったけど、引数になに指定すればいいのか分からんかった(
— あひるさん (@ahiru_sp) December 14, 2016
なんとなくapp.configに書かれてるのと同じ値で良い気はするのだけど
— あひるさん (@ahiru_sp) December 14, 2016
なるほど。リファレンスにあるprotected static な'DeployDatabaseProject(String, String, String, String)'のを使えばいいのではということですね。
SqlDatabaseTestService.DeployDatabaseProject Method (Microsoft.Data.Tools.Schema.Sql.UnitTesting)
SqlDatabaseTestServiceの派生クラスを作成する
ということで、そのままやってみます。
まず以下のような Microsoft.Data.Tools.Schema.Sql.UnitTesting.SqlDatabaseTestService
のは派生クラスを作り、DeployDatabaseProject(String, String, String, String)
を呼ぶメソッドを一つ作っておきます。
internal class CustomSqlDatabaseTestService : SqlDatabaseTestService { /// <summary> /// DBのデプロイ /// </summary> /// <param name="projectFile">プロジェクトファイルのパス(相対パス)</param> /// <param name="projectConfiguration">プロジェクトファイルの構成設定</param> /// <param name="connectionString">接続文字列</param> public void DeployDatabaseProjectEx(string projectFile, string projectConfiguration, string connectionString) { SqlDatabaseTestService.DeployDatabaseProject(projectFile, projectConfiguration, "System.Data.SqlClient", connectionString); } }
引数に何を渡すかは、app.config
のSqlUnitTestingセクション
をみれは推測はできますね。なお、第三引数はリファレンスに This must be System.Data.SqlClient.
って明記されてるので埋め込んでおきます(まあどうせSQL Serverだし)。
あとは、昨日のやつと同様、InitializeAssembly
から呼んでやればOKです。例えばこんな感じ。
using System; using System.Configuration; using Microsoft.Data.Tools.Schema.Sql.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Xml; namespace BletillaTestsNext { [TestClass()] public class SqlDatabaseSetup { // ターゲットデータベース const string TARGET_DB_PROJECT = "..\\..\\..\\ MainDb\\MainDb.sqlproj"; const string TARGET_DB_CONFIGURATION = "Release"; const string TARGET_DB_CONNECTION_STRING = "<デプロイ先のDBの接続文字列>"; // 依存データベース const string DEPEND_DB_PROJECT = "..\\..\\..\\SubDb\\SubDb.sqlproj"; const string DEPEND_DB_CONFIGURATION = "Release"; const string DEPEND_DB_CONNECTION_STRING = "<デプロイ先のDBの接続文字列> "; [AssemblyInitialize()] public static void InitializeAssembly(TestContext ctx) { var testService = new CustomSqlDatabaseTestService(); // テスト実行ターゲットをデプロイ testService.DeployDatabaseProjectEx(TARGET_DB_PROJECT, TARGET_DB_CONFIGURATION, TARGET_DB_CONNECTION_STRING ); // 依存DBをデプロイ testService.DeployDatabaseProjectEx(DEPEND_DB_PROJECT, DEPEND_DB_CONFIGURATION , DEPEND_DB_CONNECTION_STRING); // もともとあったこれは現在は使われてないので削除して問題ない //SqlDatabaseTestClass.TestService.GenerateData(); } } }
実際に試してみたら、あっさりそのまま動きました。なんだかすっきりしましたし無理やりapp.configを書き換えるとかするよりもこちらの方が断然スマートですね。
@ahiru_sp さん、ありがとうございました!