2011-06-17 4 views
0

メソッドの単体テストを試みるときに問題が発生します。このメソッドのタスクは、ツリー内のノードを移動することです。このツリーは、「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;"ユニットテスト用。

答えて

1
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()); 

から: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); 

はその後、以下のすべての呼び出しのための第二1を最初のリストを返す必要があります。

+0

答えをありがとう。私はこれを実装しようとします。 intを使用する代わりに、(任意の方法で)2つのリストを持つこともできます。 Return:ListOneとCallback:ListTwo? –

+0

私は私の答えを編集 – Zebi

+0

+1:Dこれは私が探していたものです! –

関連する問題