代码之家  ›  专栏  ›  技术社区  ›  TomSelleck

减少不同接口实现的NUnit测试中的重复

  •  2
  • TomSelleck  · 技术社区  · 7 年前

    我有以下界面:

    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()
        {
         ...
        }
    }
    

    对于我的单元测试-我现在有这样的东西,两个文件包含相同的测试-唯一的区别是实现:

    public class LinkedListStackTest
    {
        [Test]
        public void PushToStack()
        {
            //Arrange
            IStack stack = new LinkedListStack();
    
            //Act
            stack.Push(1);
    
            //Assert
            Assert.AreEqual(1, stack.Peek());
        }
    }
    

    public class ArrayStackTest
    {
        [Test]
        public void PushToStack()
        {
            //Arrange
            IStack stack = new ArrayStack();
    
            //Act
            stack.Push(1);
    
            //Assert
            Assert.AreEqual(1, stack.Peek());
        }
    }
    

    考虑到实现的测试应该是相同的-有没有一种方法可以让我编写一组NUnit测试来针对我的所有IStack实现运行?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Rui Jarimba    7 年前

    你可以用 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)
    

    …您可以返回 在里面 TestCases 财产 堆栈测试用例 :

    yield return new TestCaseData(new LinkedListStack());
    yield return new TestCaseData(new ArrayStack());
    
        2
  •  1
  •   Raviraj Palvankar    7 年前

    为此,您必须将泛型与具有接口实现的TextFixture属性一起使用。

    [TestFixture(typeof(LinkedListStack))]
    [TestFixture(typeof(ArrayStack))]
    class IStack_Contract<T> where T : IStack, new()
    {
    }
    

    您只需将类型传递给您的测试,然后它们将针对各自的实现执行。