减少针对不同接口实现的 NUnit 测试中的重复
Reduce duplication in NUnit tests for different implementations of interface
我有以下界面:
public interface IStack
{
int Peek();
void Push(int i);
}
还有两个实现:
public class LinkedListStack : IStack
{
public void Push(int x)
{
...
}
public int Peek()
{
...
}
}
public class ArrayStack : IStack
{
public void Push(int i)
{
...
}
public int Peek()
{
...
}
}
对于我的单元测试 - 我目前有类似的东西,两个文件包含相同的测试 - 唯一的区别是实现:
LinkedListStackTest.cs:
public class LinkedListStackTest
{
[Test]
public void PushToStack()
{
//Arrange
IStack stack = new LinkedListStack();
//Act
stack.Push(1);
//Assert
Assert.AreEqual(1, stack.Peek());
}
}
ArrayStackTest.cs
public class ArrayStackTest
{
[Test]
public void PushToStack()
{
//Arrange
IStack stack = new ArrayStack();
//Act
stack.Push(1);
//Assert
Assert.AreEqual(1, stack.Peek());
}
}
鉴于实现的测试应该是相同的 - 有没有一种方法可以编写一组 NUnit 测试 运行 针对我所有的 IStack 实现?
您将必须为此目的使用泛型,TextFixture 属性具有您的接口的实现。
[TestFixture(typeof(LinkedListStack))]
[TestFixture(typeof(ArrayStack))]
class IStack_Contract<T> where T : IStack, new()
{
}
您只需将类型传递给您的测试,然后它们就会针对各自的实现执行。
您可以使用 TestCaseSourceAttribute:
[Test]
[TestCaseSource(typeof(StackTestCases))]
public void PushToStack(IStack stack)
{
//Arrange/Act
stack.Push(1);
//Assert
Assert.AreEqual(1, stack.Peek());
}
实施StackTestCases
:
internal class StackTestCases : IEnumerable
{
public static IEnumerable TestCases
{
get
{
yield return new TestCaseData(new LinkedListStack());
yield return new TestCaseData(new ArrayStack());
}
}
/// <inheritdoc />
public IEnumerator GetEnumerator()
{
return TestCases.GetEnumerator();
}
}
请注意,测试方法将采用 IStack
作为参数:
[Test]
[TestCaseSource(typeof(StackTestCases))]
public void PushToStack(IStack stack)
...并且您可以 return 在 TestCases
属性 中 IStack
的不同实现 StackTestCases
:
yield return new TestCaseData(new LinkedListStack());
yield return new TestCaseData(new ArrayStack());
我有以下界面:
public interface IStack
{
int Peek();
void Push(int i);
}
还有两个实现:
public class LinkedListStack : IStack
{
public void Push(int x)
{
...
}
public int Peek()
{
...
}
}
public class ArrayStack : IStack
{
public void Push(int i)
{
...
}
public int Peek()
{
...
}
}
对于我的单元测试 - 我目前有类似的东西,两个文件包含相同的测试 - 唯一的区别是实现:
LinkedListStackTest.cs:
public class LinkedListStackTest
{
[Test]
public void PushToStack()
{
//Arrange
IStack stack = new LinkedListStack();
//Act
stack.Push(1);
//Assert
Assert.AreEqual(1, stack.Peek());
}
}
ArrayStackTest.cs
public class ArrayStackTest
{
[Test]
public void PushToStack()
{
//Arrange
IStack stack = new ArrayStack();
//Act
stack.Push(1);
//Assert
Assert.AreEqual(1, stack.Peek());
}
}
鉴于实现的测试应该是相同的 - 有没有一种方法可以编写一组 NUnit 测试 运行 针对我所有的 IStack 实现?
您将必须为此目的使用泛型,TextFixture 属性具有您的接口的实现。
[TestFixture(typeof(LinkedListStack))]
[TestFixture(typeof(ArrayStack))]
class IStack_Contract<T> where T : IStack, new()
{
}
您只需将类型传递给您的测试,然后它们就会针对各自的实现执行。
您可以使用 TestCaseSourceAttribute:
[Test]
[TestCaseSource(typeof(StackTestCases))]
public void PushToStack(IStack stack)
{
//Arrange/Act
stack.Push(1);
//Assert
Assert.AreEqual(1, stack.Peek());
}
实施StackTestCases
:
internal class StackTestCases : IEnumerable
{
public static IEnumerable TestCases
{
get
{
yield return new TestCaseData(new LinkedListStack());
yield return new TestCaseData(new ArrayStack());
}
}
/// <inheritdoc />
public IEnumerator GetEnumerator()
{
return TestCases.GetEnumerator();
}
}
请注意,测试方法将采用 IStack
作为参数:
[Test]
[TestCaseSource(typeof(StackTestCases))]
public void PushToStack(IStack stack)
...并且您可以 return 在 TestCases
属性 中 IStack
的不同实现 StackTestCases
:
yield return new TestCaseData(new LinkedListStack());
yield return new TestCaseData(new ArrayStack());