我有以下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()时发生异常 . 现在,如果我在GetAll()的调用上坚持 .Include(x => x.Users)
,我很好 . 这告诉我它与延迟加载有关 .
我得到的错误是:错误:ObjectContext实例已被释放,不能再用于需要连接的操作 .
从我的Web应用程序调用RegisterUser时,我很好 . 从我的规范测试中调用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 回答
我弄清楚问题是什么 . 我通过这一步播种了我的测试数据库:
我的TestDatabaseInitializer中的上下文必须与我在场景中创建的上下文冲突 . 感谢Gert的评论,它给了我一个想法,让我仔细看看我的其他场景中发生了什么 .