0

次の SpecFlow シナリオがあります。

[When(@"the registration is submitted")]
public void WhenTheRegistrationIsSubmitted()
{
    //var controller = _kernel.Get<AccountController>();

    var factory = new HockeyDbContextFactory();

    var userRepository = new Repository<User>(factory);
    var cryptoService = new CryptoService();
    var roleRepository = new Repository<Role>(factory);
    var playerService = new Mock<IPlayerService>();
    var leagueService = new Mock<ILeagueService>();
    var userService = new UserService(userRepository, cryptoService, roleRepository);
    var controller = new AccountController(userService, playerService.Object, leagueService.Object);

    controller.Register(_registerModel);
}

最終的にコントローラーを介して次のメソッドを呼び出します。

public void RegisterUser(User user)
{
    var salt = _cryptoService.GenerateSalt();
    var hasedPassword = _cryptoService.HashPassword(user.Password, salt);

    user.PasswordSalt = salt;
    user.Password = hasedPassword;

    var defaultRole = _roleRepository.GetAll().Single(x => x.RoleName == "User");
    user.Roles.Add(defaultRole);

    Insert(user);
}

次の行に到達するまで、すべてのデータベース呼び出しに問題はありません。

var defaultRole = _roleRepository.GetAll().Single(x => x.RoleName == "User");

その行にブレークポイントを設定して GetAll() の呼び出しを調べると、コンテキストがあり、クエリを表示できます。Single() の呼び出しで例外が発生します。ここで、.Include(x => x.Users)GetAll() の呼び出しに固執すれば、問題ありません。これは、遅延読み込みと関係があることを示しています。

私が得るエラーは次のとおりです: エラー: ObjectContext インスタンスが破棄され、接続を必要とする操作には使用できなくなりました。

私の Web アプリケーションから RegisterUser が呼び出されたときは、問題ありません。私の仕様テストから RegisterUser を呼び出すと、失敗します。誰かが扇動していますか?

アップデート:

もう少し情報を追加するために、呼び出されるコントローラーアクションは次のとおりです。

[HttpPost]
[AllowAnonymous]
public ActionResult Register(RegisterModel model)
{
    if (!_userService.EmailIsUnique(model.EmailAddress))
        ModelState.AddModelError("EmailAddress", "Email Address is already in use.");

    if (!_userService.UserNameIsUnique(model.UserName))
        ModelState.AddModelError("UserName", "User Name is already in use");

    if (ModelState.IsValid)
    {
        // Attempt to register the user
        try
        {

            var user = Mapper.Map<User>(model);
            _userService.RegisterUser(user);
            FormsAuthentication.SetAuthCookie(model.UserName, false);

            return View("RegisterSuccess");
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

コードをステップ実行しても、決してたどり着けませんFormsAuthentication.SetAuthCookie(model.UserName, false);

4

1 に答える 1

0

私は問題が何であるかを理解しました。このステップでテストデータベースをシードしていました:

[BeforeFeature]
public static void BeforeFeature()
{
    MappingConfig.RegisterMappings();
    Database.SetInitializer(new TestDatabaseInitializer());
}

TestDatabaseInitializer のコンテキストは、シナリオで作成したコンテキストと競合していたはずです。Gert さんのコメントに感謝します。それは、私のシナリオの残りの部分で何が起こっているのかを詳しく調べるという考えを与えてくれました。

于 2013-08-03T22:45:28.267 に答える