При попытке юнит-тестирования метода я столкнулся с проблемой.Задача метода - переместить узел в дереве.Это дерево строится с помощью метода «Preorder Tree Traversal».http://blogs.sitepoint.com/hierarchical-data-database-2/ Этот метод использует значения узла Left и Right для позиционирования его в дереве.
В методе значения 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 для Meat.(Их должно быть 9 - 10) Я проследил проблему до макета метода «GetDescendants (Meat.Id, It.IsAny ()))».Этот метод будет вызываться дважды в методе, который я пытаюсь проверить.В первый раз он должен вернуть список с узлами «Говядина» и «Свинина».Во второй раз узел «Говядина» помещается под «Банан», он должен вернуть список только с узлом «Свинина».
Кто может помочь мне выяснить, как макет может вернуть список с 2 узламив первый раз, а список только с одним узлом во второй раз?
Я использую "Microsoft.VisualStudio.TestTools.UnitTesting;"и "Moq;"для модульного тестирования.