2010-07-13 48 views
0

我得到這個錯誤在我的單元測試:Assert.AreEqual在兩個相同的MVC 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 = "[email protected]" 
              } 
         }; 

     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失敗了?當我調試時,ViewModels(model和result.ViewData.Model)是相同的。

非常感謝。

回答

1

AccountViewModel IEquatable?如果不是,C#將只使用Object.ReferenceEquals來比較它們。只有當它們都引用完全相同的對象(具有相同的屬性值不夠好)時,情況纔會如此。

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(); 
    } 
+0

喬納森嗨,你可以給我一個例子或指向我一個約忽略equals()和GetHashCode()方法的鏈接?我不知道我需要做什麼:)非常感謝。 – 2010-07-14 15:36:47

+0

這就是我現在所擁有的,這似乎並不工作: public override bool Equals(object obj) { if(obj == this) return true; var that = obj作爲AccountViewModel; return that!= null && Equals(this,that); } public override int GetHashCode() { return base.GetHashCode(); } 謝謝。 – 2010-07-14 16:08:49

+0

你需要決定你的對象是什麼平等。我嘗試挑選一個代表實體身份的屬性。然後,我會在GetHashCode()重寫中返回該屬性的哈希碼,並覆蓋Equals(),從該方法中引用GetHashCode() - 回答編輯樣例。它是一個開始的基本框架。就你而言,你可能想要使用EmailAddress屬性開始嵌套的User對象。並且在賬戶模型中可以基於內部用戶對象。在這裏你會比較你想要的功能而不是對象引用。 – 2010-07-14 18:25:48

相關問題