Модульное тестирование в C #: вернуть другой var при вызове проверенного метода во второй раз - PullRequest
0 голосов
/ 17 июня 2011

При попытке юнит-тестирования метода я столкнулся с проблемой.Задача метода - переместить узел в дереве.Это дерево строится с помощью метода «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;"для модульного тестирования.

1 Ответ

1 голос
/ 17 июня 2011
returning different values on each invocation
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
    .Returns(() => calls)
    .Callback(() => calls++);
// returns 0 on first invocation, 1 on the next, and so on
Console.WriteLine(mock.Object.GetCountThing());

from: http://code.google.com/p/moq/wiki/QuickStart

Однако, если ваша макетная установка настолько сложна, может быть лучше использовать db в памяти или что вы используете вместо этого.Логика насмешек очень хрупкая и трудно читаемая.

Чтобы ответить на ваш комментарий:

var mock = new Mock<IFoo>();
bool firstCall = true;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => firstCall ? list1 : list2)
.Callback(() => firstCall = false);

должен вернуть первый список, а затем второй для всех последующих вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...