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 は抽象クラスです。

前もって感謝します。

編集

ダリンの応答から提案された改訂後のコードを次に示します。

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

2 に答える 2

5

期待値を定義する場合は、 Childrenコレクション プロパティを仮想にする必要があります

public abstract class ZooNode
{
    public ZooNode Parent { get; set; }
    public virtual IList<ZooNode> Children { get; set; }
}
于 2009-01-18T20:29:08.030 に答える
1

チャンス、実際に Children コレクションを初期化することはありません。したがって、コンストラクターで初期化する必要があるか、Moq にデフォルトでモックするように指示できます。

var parent = new Mock<ZooNode>() { DefaultValue = DefaultValue.Mock };
于 2009-01-19T01:35:55.447 に答える