2010-07-13 6 views
0

J'ai eu cette erreur sur mon test unitaire:Assert.AreEqual a échoué sur deux résultats MVC ViewModel identiques?

Assert.AreEqual failed. Expected:<ShizoMe.Web.ViewModel.AccountViewModel>. Actual:<ShizoMe.Web.ViewModel.AccountViewModel>. 

Voici le code pour mon test:

[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); 
    } 

C'est ma méthode de Registre:

[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); 
    } 

Toute idée pourquoi la dernière Assert.AreEqual a échoué? Lorsque je débogue, les ViewModels (model et result.ViewData.Model) sont les mêmes.

Merci beaucoup.

Répondre

1

Est-ce que AccountViewModel IEquatable? Sinon, C# utilisera simplement Object.ReferenceEquals pour les comparer. Cela ne sera vrai que s'ils se réfèrent tous deux exactement au même objet (avoir les mêmes valeurs de propriété n'est pas assez bon).

1

Avez-vous remplacé les méthodes Equals() et GetHashCode() pour votre classe AccountViewModel?

exemple:

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

Salut Jonathan, pouvez-vous me donner un exemple ou me pointe vers un lien sur le remplacement Equals() et les méthodes GetHashCode()? Je n'ai aucune idée de ce que je dois faire :) Merci beaucoup. –

+0

C'est ce que j'ai en ce moment, qui ne semble pas fonctionner: public override bool Equals (objet obj) { if (obj == this) return true; var that = obj en tant que AccountViewModel; return that! = Null && Est égal à (ceci, cela); } public override int GetHashCode() { return base.GetHashCode(); } Merci. –

+0

Vous devez décider quelle est l'égalité pour votre objet. J'essaie de choisir une propriété qui représente l'identité d'une entité. Je retournerais alors le code de hachage de cette propriété dans le remplacement de GetHashCode() et substituerais Equals(), en référençant GetHashCode() à partir de cette méthode - réponse éditée avec l'échantillon. C'est un cadre de base pour commencer. Dans votre cas, vous pouvez commencer avec l'objet Utilisateur imbriqué, en utilisant la propriété EmailAddress. Et dans le modèle de compte pourrait être basé sur l'objet utilisateur interne. Dans ce cas, vous comparez les fonctionnalités que vous souhaitez et non les références d'objets. –