与MOQ

2009-01-18 78 views
2

有问题,我尝试起订量和我遇到一个问题,下面的测试体:与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); 

会抛出:

System.ArgumentException:无效 预期上一个不可覆盖的 成员:p => p.Children.Contains(value(ZooCms.Core.Tests.Model.ZooNodeTest + <> c__DisplayClass0).child.Object)。

我不太确定它的moq,但我测试的代码非常简单。我不确定它是否重要,但ZooNode是一个抽象类。

在此先感谢。

编辑

继承人从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; } 

} 

现在抛出

试验方法 ZooCms.Core.Tests.Model.ZooNodeTest .TestSetParentAddsNodeToParentNodeList 抛出异常: System.NullReferenceException:对象 引用未设置为一个 对象的实例..

回答

4

儿童集合属性必须是虚拟的,如果你想在这里定义的期望:

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

当我尝试,我得到下面的异常信息:System.NullReferenceException: ZooCms.Core.Tests.Model.ZooNodeTest.TestSetParentAddsNodeToParentNodeList抛出异常检测方法的对象引用不设置到对象的实例.. – Chance 2009-01-18 20:45:18

1

机会, 你永远不会实际初始化Children集合。因此,无论是需要在构造函数中初始化它,还是默认情况下都可以告诉Moq。

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