2016-09-06 10 views
1

私はDIを使用して依存関係を調べ、ユニットテストのためにそれらを嘲笑することを理解します。しかし、私がユニットテストをしている現在の機能の実装が複数ある場合、それらをユニットテストにどのように注入すればいいですか?ユニットテストにDIを使用する

例:クイックソートやマージソート

public class TestSort 
{ 
    ISort sort = null; 
    [TestInitialize] 
    public void Setup() 
    { 
     sort = new MergeSort(); // or any implementation which need to be injected on setup 
    } 
+1

Parametrisedテストは[こちら]オプションであってもよいが、読み取りを持っている可能性があざける行うために部品番号を使用しています

(http://stackoverflow.com/questions/9021881/how-to-run- MsTestを使用するのは簡単ではないということについては、mstest-a-test-method-multiple-parameters-in-mstestを使用してください。 – kayess

+0

@kayessこれは興味深いです – Pacchy

答えて

3

あなたの「並べ替え」のメソッドをテストしたい場合は、各ソートアルゴリズムのための独立したユニットテストを持っている必要があります。例

[TestMethod] 
public void MergeSort_SortUnderorderedList_ShouldSortListCorrectly() 
{ 
    // Arrange 
    ISort sort = new MergeSort(); 

    // Act 
    int[] sortedList = sort.Sort(new int[] { 4, 2, 18, 5, 19 }); 

    // Assert 
    Assert.AreEqual(2, sortedList[0]); 
    Assert.AreEqual(4, sortedList[1]); 
    Assert.AreEqual(5, sortedList[2]); 
    Assert.AreEqual(18, sortedList[3]); 
    Assert.AreEqual(19, sortedList[4]);  
} 

[TestMethod] 
public void QuickSort_SortUnderorderedList_ShouldSortListCorrectly() 
{ 
    // Arrange 
    ISort sort = new QuickSort(); 

    // Act 
    int[] sortedList = sort.Sort(new int[] { 4, 2, 18, 5, 19 }); 

    // Assert 
    Assert.AreEqual(2, sortedList[0]); 
    Assert.AreEqual(4, sortedList[1]); 
    Assert.AreEqual(5, sortedList[2]); 
    Assert.AreEqual(18, sortedList[3]); 
    Assert.AreEqual(19, sortedList[4]); 
} 

あなたがにソートアルゴリズムを注入クラスのテストを書いているために、あなたはソートアルゴリズムは、そのテストで正常に動作するかどうかをテストするべきではありません。その代わりに、ソートアルゴリズムモックを注入し、Sort()メソッドが呼び出されていることをテストする必要があります(ただし、そのテストでのソートアルゴリズムの正しい結果はテストされません)。この例では、

public class MyClass 
{ 
    private readonly ISort sortingAlgorithm; 

    public MyClass(ISort sortingAlgorithm) 
    { 
     if (sortingAlgorithm == null) 
     { 
     throw new ArgumentNullException("sortingAlgorithm"); 
     } 
     this.sortingAlgorithm = sortingAlgorithm; 
    } 

    public void DoSomethingThatRequiresSorting(int[] list) 
    { 
     int[] sortedList = this.sortingAlgorithm.Sort(list); 

     // Do stuff with sortedList 
    } 
} 

[TestClass] 
public class MyClassTests 
{ 
    [TestMethod] 
    public void DoSomethingThatRequiresSorting_SomeCondition_ExpectedResult() 
    { 
     // Arrange - I assume that you need to use the result of Sort() in the 
     // method that you're testing, so the Setup method causes sortingMock 
     // to return the specified list when Sort() is called 
     ISort sortingMock = new Mock<ISort>(); 
     sortingMock.Setup(e => e.Sort().Returns(new int[] { 2, 5, 6, 9 })); 
     MyClass myClass = new MyClass(sortingMock.Object); 

     // Act 
     myClass.DoSomethingThatRequiresSorting(new int[] { 5, 9, 2, 6 }); 

     // Assert - check that the Sort() method was called 
     myClass.Verify(e => e.Sort(It.IsAny<int[]>)); 
    } 
} 
+0

OPはMsTestを使用しNUnitを使用していないことに気付きましたか? – kayess

+0

@kayess NUnitは私の答えと何が関係していますか? –

+0

@benあなたの答えの最初の部分は私が排除する必要があったものです。私は間違いなく依存性のために使っています。私はそれについてはっきりしています。 – Pacchy

関連する問題