ASP.NET 5.xのプロジェクトでは、asp.netの定型文を使用しています。私は、既存のテストデータベース(ホスト用に1つのdb、テナント用にもう1つのdb)を呼び出すこのプロジェクトのテストケースを作成しようとしています。私は(私が使用するテストホストデータベースとテストテナントデータベースのデータをシードれるMultiTenantMigrateExecuter.Run()
と同じように動作するメソッドを呼び出していますTestBase
クラスのコンストラクタでASP.NET Boilerplate、実在のデータベースを使用したテストケース
- :私の手順は、これまでになかったですホストdbとテスト用の単一のテナントdb)。シードは、テストDBの名前が異なるだけで、実際のdbと同じになります。
- また、
TestBase
クラスのコンストラクタから、私はTenantIdをホストデータベースから取得しています。 - 次のように、テナントデータベース からシードされたユーザーを取得しようとしています。これは
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;
}