4

asp.net ID RTW バージョンを使用します。

UserMananger関数呼び出しとその他の操作の両方を含む、トランザクションでいくつかのアクションを実行する必要がありますDbContext(例: 新しいユーザーを作成し、グループに追加し、いくつかのビジネス ロジック操作を実行します)。

どうすればいいですか?

私の考えは続きます。

トランザクションスコープ

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
    // Do what I need
    if (everythingIsOk) scope.Complete();
}

問題はUserManager、関数がすべて非同期であり、TransactionScopeasync/await で動作するように設計されていないことです。.Net Framework 4.5.1 で解決されたようです。しかし、Azure Web サイトを使用してプロジェクト ビルドをホストしているため、まだ 4.5.1 をターゲットにすることはできません。

データベース トランザクション

public class SomeController : Controller
{
    private MyDbContext DbContext { get; set; }
    private UserManager<User> UserManager { get; set; }

    public AccountController()
    {
        DbContext = new MyDbContext()
        var userStore = new UserStore<IdentityUser>(DbContext);
        UserManager = new UserManager<IdentityUser>(userStore);
    }

    public async ActionResult SomeAction()
    {
        // UserManager uses the same db context, so they can share db transaction
        using (var tran = DbContext.Database.BeginTransaction())
        {
            try
            {
                // Do what I need
                if (everythingIsOk)
                    tran.Commit();
                else
                {
                    tran.Rollback();
                }
            }
            catch (Exception)
            {
                tran.Rollback();
            }
        }
    }
}

それはうまくいくようですが、どうすればユニットテストできますか?

UserManager<>コンストラクターは を受け入れるIUserStore<>ので、簡単にスタブできます。

UserStore<>コンストラクターは を受け入れますDbContextが、これをスタブする方法がわかりません。

4

1 に答える 1

0

単体テスト用にスタブ化できる独自のテスト ユーザー ストアを実装できます。

テストで実際の EF UserStore を使用する場合も機能しますが、デフォルトで DefaultConnection 文字列を使用してデータベースを作成します。すべてのテストでクリーンなデータベースを確保したい場合は、DatabaseInitializer を指定して、テストで常にテーブルを削除/再作成することができます。

于 2013-10-15T17:36:31.310 に答える