メソッドの単体テストを試みるときに問題が発生します。このメソッドのタスクは、ツリー内のノードを移動することです。このツリーは、「Preorder Tree Traversal」メソッドを介して構築されます。 http://blogs.sitepoint.com/hierarchical-data-database-2/このメソッドは、ノードの左と右の値を使用してツリー内に配置します。C#のユニットテスト:2回目の模擬メソッド呼び出し時に他のvarを返します
この方法では、ノードのLft値とRgt値が変更されます。私のテストケースでは、 "肉"を "バナナ"の下に移動します。
var Food = new Node { Id = Guid.NewGuid(), Title = "Food", Ordinal = 0,Depth = 0, Lft = 1, Rgt = 18};
var Fruit = new Node { Id = Guid.NewGuid(), Title = "Fruit", ParentNode = Food, Depth = 1, Ordinal = 0, Lft = 2, Rgt = 11 };
var Red = new Node { Id = Guid.NewGuid(), Title = "Red", ParentNode = Fruit, Depth = 2, Ordinal = 0, Lft = 3, Rgt = 6 };
var Cherry = new Node { Id = Guid.NewGuid(), Title = "Cherry", ParentNode = Red, Depth = 3, Ordinal = 0, Lft = 4, Rgt = 5 };
var Yellow = new Node { Id = Guid.NewGuid(), Title = "Yellow", ParentNode = Fruit, Depth = 2, Ordinal = 1, Lft = 7, Rgt = 10 };
var Banana = new Node { Id = Guid.NewGuid(), Title = "Banana", ParentNode = Yellow, Depth = 3, Ordinal = 0, Lft = 8, Rgt = 9 };
var Meat = new Node { Id = Guid.NewGuid(), Title = "Meat", ParentNode = Food, Depth = 1, Ordinal = 1, Lft = 12, Rgt = 17 };
var Beef = new Node { Id = Guid.NewGuid(), Title = "Beef", ParentNode = Meat, Depth = 2, Ordinal = 0, Lft = 13, Rgt = 14 };
var Pork = new Node { Id = Guid.NewGuid(), Title = "Pork", ParentNode = Meat, Depth = 2, Ordinal = 1, Lft = 15, Rgt = 16 };
var allNodes = new List<Node> {Food, Fruit, Red, Cherry, Yellow, Banana, Meat, Beef, Pork};
var descendantsOfNodeFood = new List<Node>
{
Beef,
Cherry,
Red,
Yellow,
Pork,
Banana,
Meat,
Fruit
};
var descendantsOfNodeFruit = new List<Node>
{
Red,
Cherry,
Banana,
Yellow
};
var descendantsOfNodeRed = new List<Node>
{
Cherry
};
var descendantsOfNodeCherry = new List<Node> { };
var descendantsOfNodeYellow = new List<Node>
{
Banana
};
var descendantsOfNodeBanana = new List<Node> { };
var descendantsOfNodeMeat = new List<Node>
{
Beef,
Pork
};
var descendantsOfNodeBeef = new List<Node> { };
var descendantsOfNodePork = new List<Node> { };
//Mock the node repository
_mockNodeRepository.Setup(x => x.LoadNode(Food.Id)).Returns(Food);
_mockNodeRepository.Setup(x => x.GetDescendants(Food.Id, It.IsAny<bool>())).Returns(descendantsOfNodeFood);
_mockNodeRepository.Setup(x => x.GetDescendants(Fruit.Id, It.IsAny<bool>())).Returns(descendantsOfNodeFruit);
_mockNodeRepository.Setup(x => x.GetDescendants(Red.Id, It.IsAny<bool>())).Returns(descendantsOfNodeRed);
_mockNodeRepository.Setup(x => x.GetDescendants(Cherry.Id, It.IsAny<bool>())).Returns(descendantsOfNodeCherry);
_mockNodeRepository.Setup(x => x.GetDescendants(Yellow.Id, It.IsAny<bool>())).Returns(descendantsOfNodeYellow);
_mockNodeRepository.Setup(x => x.GetDescendants(Banana.Id, It.IsAny<bool>())).Returns(descendantsOfNodeBanana);
_mockNodeRepository.Setup(x => x.GetDescendants(Meat.Id, It.IsAny<bool>())).Returns(descendantsOfNodeMeat);
_mockNodeRepository.Setup(x => x.GetDescendants(Beef.Id, It.IsAny<bool>())).Returns(descendantsOfNodeBeef);
_mockNodeRepository.Setup(x => x.GetDescendants(Pork.Id, It.IsAny<bool>())).Returns(descendantsOfNodePork);
_mockNodeRepository.Setup(x => x.GetNodes()).Returns(allNodes);
テストを実行すると、すべての値が肉のLftとRgtの値を除いて正しい値に設定されます。 (彼らは9〜10でなければなりません)私はメソッド "GetDescendants(Meat.Id、It.IsAny()))のモックに問題をトレースしました"。このメソッドは、私がテストしようとするメソッドで2回呼び出されます。ノード "Beef"と "Pork"を持つリストを最初に返します。 2回目のノード "Beef"は "Banana"の下に置かれ、ノード "Pork"だけのリストが返されます。
2人目のノードでリストを返す方法と、2人目に1人のノードしか持たないリストをどのように戻すことができますか?
「Microsoft.VisualStudio.TestTools.UnitTesting;」を使用しています。と "Moq;"ユニットテスト用。
答えをありがとう。私はこれを実装しようとします。 intを使用する代わりに、(任意の方法で)2つのリストを持つこともできます。 Return:ListOneとCallback:ListTwo? –
私は私の答えを編集 – Zebi
+1:Dこれは私が探していたものです! –