我正在尝试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 引用未设置为的实例 对象..
答案 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 };