我的单元测试出现了这个错误:
Assert.AreEqual failed. Expected:<ShizoMe.Web.ViewModel.AccountViewModel>. Actual:<ShizoMe.Web.ViewModel.AccountViewModel>.
这是我测试的代码:
[TestMethod]
public void Register_Prevents_Duplicate_Users()
{
var controller = GetAccountController();
var model = new AccountViewModel
{
Register = new RegisterModel
{
EmailAddress = "testUser@test.com"
}
};
var result = (ViewResult) controller.Register(model.Register);
Assert.AreEqual("A user with this email address already exists.",
controller.ModelState["UserExists"].Errors[0].ErrorMessage);
Assert.AreEqual(model, result.ViewData.Model);
}
这是我的注册方法:
[HttpPost]
public virtual ActionResult Register([Bind(Prefix = "Register")]RegisterModel model)
{
var accountModel = new AccountViewModel();
if (ModelState.IsValid)
{
if (_accountRepository.GetUser(model.EmailAddress) != null)
{
ModelState.AddModelError("UserExists", "A user with this email address already exists.");
return View(accountModel);
}
var newUser = new User
{
EmailAddress = model.EmailAddress,
Password = model.Password,
CreatedDate = DateTime.UtcNow
};
if (_accountRepository.RegisterUser(newUser))
{
_formsService.SignIn(newUser);
return RedirectToAction(MVC.Home.Index());
}
}
return View(accountModel);
}
知道为什么最后一个Assert.AreEqual失败了吗?当我调试时,ViewModel(model和result.ViewData.Model)是相同的。
非常感谢。
答案 0 :(得分:1)
AccountViewModel是IEquatable吗?如果没有,C#将只使用Object.ReferenceEquals来比较它们。只有当它们都引用完全相同的对象(具有相同的属性值不够好)时才会成立。
答案 1 :(得分:1)
您是否覆盖了AccountViewModel类的Equals()和GetHashCode()方法?
示例:
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (Object.ReferenceEquals(this, obj))
{
return true;
}
if (this.GetHashCode() == obj.GetHashCode())
{
return true;
}
return false;
}
public override int GetHashCode()
{
return Id.GetHashCode();
}