2013-08-03 41 views
0

我有以下SpecFlow場景:規格測試與EF - 的ObjectContext的實例已經佈置

[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()的調用發生異常。現在,如果我在調用GetAll()時附加一個.Include(x => x.Users),我很好。這告訴我這與延遲加載有關。

我得到的錯誤是:錯誤:ObjectContext的實例已設置,並且不能再被用於需要連接的操作。

當RegisterUser從我的web應用程序調用,我沒事。當我從我的規格測試中調用RegisterUser時,它失敗。有人有煽動性嗎?

UPDATE:

要加一點的更多信息,這裏是控制器動作被稱爲:

[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);

+1

這意味着,在您的SpecFlow方案'role.Users'被訪問時,觸發延遲加載,而背景消失了。很難告訴外界可能發生的情況。 –

+0

我添加了一個更新,以顯示控制器動作,但我SpecFlow情況是沒有做別的。我已經撕毀了DI並儘可能地簡化了問題。我有一個給定的設置_registerModel,但這只是設置一些靜態數據。 – ryanw51

回答

0

我找出問題所在。我播種我的測試數據庫,此步驟:

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

我TestDatabaseInitializer上下文必須已與我在場景中創建的上下文衝突。感謝Gert的評論,它給了我一個想法,仔細觀察我的其餘場景中發生了什麼。

相關問題