如果你想測試你的「排序」的方法,你應該爲每個排序算法獨立的單元測試。例如
[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