有moq的问题

时间:2009-01-18 20:08:51

标签: c# unit-testing moq

我正在尝试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 =&gt;   p.Children.Contains(值(ZooCms.Core.Tests.Model.ZooNodeTest + LT;&GT; 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:Object   引用未设置为的实例   对象..

2 个答案:

答案 0 :(得分:5)

如果您想要定义期望, Children 集合属性需要是虚拟的:

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

答案 1 :(得分:1)

可能,   您永远不会实际初始化Children集合。因此,您需要在构造函数中初始化它,或者您可以告诉Moq默认情况下将其模拟。

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