2009-01-18 7 views
2

Je suis d'essayer moq et je suis en cours d'exécution dans un problème avec le corps de test suivant:Les questions qui avec moq

var child = new Mock<ZooNode>(); 
var parent = new Mock<ZooNode>(); 
child.Object.Parent = parent.Object; 
parent.Expect(p => p.Children.Contains(child.Object)).Returns(true); 

qui lance:

System.ArgumentException: Invalid attente sur un membre non prioritaire : p => p.Children.Contains (valeur (ZooCms.Core.Tests.Model.ZooNodeTest + <> c__DisplayClass0) .child.Object).

et je ne suis pas tout à fait sûr si son moq, mais le code que je teste est assez simple. Je ne sais pas si c'est important, mais ZooNode est une classe abstraite.

Merci d'avance.

EDIT

Heres le code après révision suggéré de darin's response:

public abstract class ZooNode : ZooObject 
{ 
    private ZooNode _parent{ get; set;} 
    public ZooNode Parent { 
     get 
     { 
      return _parent; 
     } 
     set 
     { 
      if(Parent != null) 
       Parent.Children.Remove(value); 
      _parent = value; 
      _parent.Children.Add(this); 
     } 
    } 
    public virtual IList<ZooNode> Children { get; private set; } 

} 

il lance maintenant

Méthode d'essai ZooCms.Core.Tests.Model.ZooNodeTest .TestSetParentAddsNodeToParentNodeList exception jeté: System.NullReferenceException: objet référence non définie à une instance d'un objet ..

Répondre

4

Vos enfants propriété de collection doit être virtuel si vous voulez définir les attentes à ce sujet:

public abstract class ZooNode 
{ 
    public ZooNode Parent { get; set; } 
    public virtual IList<ZooNode> Children { get; set; } 
} 
+0

Lorsque je tente, je reçois l'exception suivante: Méthode d'essai ZooCms.Core.Tests.Model.ZooNodeTest.TestSetParentAddsNodeToParentNodeList a lancé exception: System.NullReferenceException: référence d'objet fixe pas à une instance d'un objet .. – Chance

+0

Ah - compris, tout objet qu'il utilise doit être virtuel .. merci l'homme – Chance

1

Chance, Vous n'êtes jamais en train d'initialiser la collection Children. Donc, soit vous devez l'initialiser dans un constructeur, soit vous pouvez dire à Moq de se moquer de lui par défaut.

var parent = new Mock<ZooNode>() { DefaultValue = DefaultValue.Mock };