如果你想测试你的“排序”的方法,你应该为每个排序算法独立的单元测试。例如
[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[]>));
}
}
Parametrised测试可能是一种选择,但有一个读[这里](http://stackoverflow.com/questions/9021881/how-to-run- a-test-method-with-multiple-parameters-in-mstest)关于使用MsTest并不容易。 – kayess
@ kayess这很有趣 – Pacchy