我有以下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);
這意味着,在您的SpecFlow方案'role.Users'被訪問時,觸發延遲加載,而背景消失了。很難告訴外界可能發生的情況。 –
我添加了一個更新,以顯示控制器動作,但我SpecFlow情況是沒有做別的。我已經撕毀了DI並儘可能地簡化了問題。我有一個給定的設置_registerModel,但這只是設置一些靜態數據。 – ryanw51