Assert.AreEqual在两个相同的MVC ViewModel结果上失败了吗?

时间:2010-07-13 18:50:59

标签: asp.net-mvc unit-testing viewmodel

我的单元测试出现了这个错误:

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)是相同的。

非常感谢。

2 个答案:

答案 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();
    }