2017-07-03 3 views
0

ASP.NET 5.xのプロジェクトでは、asp.netの定型文を使用しています。私は、既存のテストデータベース(ホスト用に1つのdb、テナント用にもう1つのdb)を呼び出すこのプロジェクトのテストケースを作成しようとしています。私は(私が使用するテストホストデータベースとテストテナントデータベースのデータをシードれるMultiTenantMigrateExecuter.Run()と同じように動作するメソッドを呼び出していますTestBaseクラスのコンストラクタでASP.NET Boilerplate、実在のデータベースを使用したテストケース

  1. :私の手順は、これまでになかったですホストdbとテスト用の単一のテナントdb)。シードは、テストDBの名前が異なるだけで、実際のdbと同じになります。
  2. また、TestBaseクラスのコンストラクタから、私はTenantIdをホストデータベースから取得しています。
  3. 次のように、テナントデータベース からシードされたユーザーを取得しようとしています。これはvar user= UsingDbContext(context => context.Users.FirstOrDefault(t => t.UserName== "johndoe"));ですが、もちろんこれはTenantDbではなくHostDbを呼び出すことになります。

私はTenantDbから、私は必要なユーザーを得ることができるようにするために、contextをavoidint、このようなusingステートメント内のコードをラップして、リポジトリをUSINTによってTenantDbへの呼び出しを行うための方法を見つけた:

using (this.AbpSession.Use(tenant.Id, null)) 
{ 
    // get the TenantDb.User here by using the User repository 
} 

...そして私が書くすべてのテストケースでは、このような:

using (this.AbpSession.Use(AbpSession.TenantId, AbpSession.UserId)) 
{ 
    // make calls to the Tenant database here by using Tenant repository 
} 

が、これは最もクリーンなソリューションではありません、そしてそれはその制限があります。

私の場合、TestBaseクラスに、ホストデータベースの代わりにデフォルトでテナントデータベースを呼び出すためのコンテキストを設定するのが良い方法はありますか?

私はTestBaseクラスで ...コードでしばらく遊んだ後、私は私の質問への答えを見つけた...

protected T UsingTenantDbContext<T>(Func<TestAppDbContext, T> func) 
{ 
    T result; 

    using (this.AbpSession.Use(AbpSession.TenantId, AbpSession.UserId)) 
    { 
     using (var context = LocalIocManager.Resolve<TestAppDbContext>()) 
     { 
      context.DisableAllFilters(); 
      result = func(context); 
      context.SaveChanges(); 
     } 
    } 

    return result; 
} 

答えて

0

を私も、このいずれかを試してみましたが、それは動作しません。このクラスは複数回継承されますが、tenantContextは一度だけ設定する必要がありますので、

internal static MyAppDbContext tenantContext; 

静的:新しい静的プロパティを作成しました」。一度あなたがあなたのテストケースでそれを使用することができます作成​​し

protected void CreateTenantDbContext() 
{ 
    if (tenantContext == null) 
    { 
     using (var context = LocalIocManager.Resolve<MyAppDbContext>()) 
     { 
      // AbpSession.TenantId is set in a previous method. 
      // Usin the host context, get the Connection String for the necessary tenant 
      var encryptedDbConnString = context.Tenants.FirstOrDefault(x => x.Id == AbpSession.TenantId)?.ConnectionString; 

      // Decrypt the string 
      var decryptedDbConnString = SimpleStringCipher.Instance.Decrypt(encryptedDbConnString); 

      // Create the context for the tenant db and assign it to the static property tenantContext 
      tenantContext = LocalIocManager.Resolve<MyAppDbContext>(new { nameOrConnectionString = decryptedDbConnString }); 
     } 
    } 
} 

次の私は、次のメソッドを作成しました。

関連する問題