如果你想测试你的“排序”方法,你应该对每个排序算法进行单独的单元测试。例如
[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() 方法是否被调用(但不在该测试中测试排序算法的正确结果)。
本示例使用 Moq 进行模拟
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[]>));
}
}