2016-09-06 111 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- a-test-method-with-multiple-parameters-in-mstest)关于使用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