【问题标题】:Having issues with moq起订量有问题
【发布时间】:2009-01-18 20:08:51
【问题描述】:

我正在尝试最小起订量,但我遇到了以下测试体的问题:

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)。

我不太确定它是否起订量,但我正在测试的代码相当简单。我不确定这是否重要,但 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:对象 引用未设置为 对象..

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

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

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

    【讨论】:

    • 当我尝试这样做时,我得到以下异常:测试方法 ZooCms.Core.Tests.Model.ZooNodeTest.TestSetParentAddsNodeToParentNodeList 抛出异常:System.NullReferenceException:对象引用未设置为对象的实例。 .
    • 啊 - 想通了,它使用的任何对象都需要是虚拟的.. 谢谢人
    【解决方案2】:

    机会, 您从未真正初始化 Children 集合。所以,要么你需要在构造函数中初始化它,要么你可以告诉 Moq 默认 Mock 它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 2013-03-03
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多