假设我的System Under Test中有类A
和B
:
namespace SystemUnderTest;
public class A
{
private int m_x;
public int X => m_x;
public A(int x)
{
m_x = x;
}
}
public class B
{
private A m_a;
public A? AProperty => m_a;
public int Y => m_a.X + 1;
public B(A a)
{
m_a = a;
}
}
假设我有以下测试:
using NUnit.Framework;
using SystemUnderTest;
namespace Test
{
[TestFixture]
public class UnitTest1
{
private A m_a;
private B m_b;
[SetUp]
public void Setup()
{
m_a = new A(1);
m_b = new B(m_a);
}
[Test]
public void Test1()
{
Assert.True(m_b.AProperty != null && m_b.AProperty.X == 1);
}
[Test]
public void Test2()
{
Assert.True(m_b.Y == 2);
}
}
}
假设我只想对A
的性质X
的检验进行参数化。假设我不想参数化其他任何东西。
一种方法是完全摆脱SetUp
方法,并引入TestCase
属性:
using NUnit.Framework;
using SystemUnderTest;
namespace Test
{
[TestFixture]
public class UnitTest2
{
[TestCase(0)]
[TestCase(1)]
public void Test1(int x)
{
A a = new A (x);
B b = new B(a);
Assert.True(b.AProperty != null && b.AProperty.X == x);
}
[Test]
public void Test2()
{
A a = new A(1);
B b = new B(a);
Assert.True(b.Y == 2);
}
}
}
但这确实涉及到重复非常相似的代码多次,因为第二个测试依赖于A
的工作,但没有真正测试A
中的任何功能。
另一种方法是将TestFixture
参数化,如下所示:
using NUnit.Framework;
using SystemUnderTest;
namespace Test
{
[TestFixture(0)]
[TestFixture(1)]
public class UnitTest3
{
private A m_a;
private B m_b;
private int m_x;
public UnitTest3(int x)
{
m_x = x;
m_a = new A(x);
m_b = new B(m_a);
}
[Test]
public void Test1()
{
Assert.True(m_b.AProperty != null && m_b.AProperty.X == m_x);
}
[Test]
public void Test2()
{
m_a = new A(1);
m_b = new B(m_a);
Assert.True(m_b.Y == 2);
}
}
}
但是现在Test2
运行两次,我需要重写m_a
和m_b
的定义。
所以我真正需要的是保留SetUp
方法,并将A
保留在其中,然后以某种方式控制传递给A
构造函数的内容。
在Nunit
中是否有任何现成的解决方案?
[Values]
属性可能对您有所帮助。就像
[SetUp]
public void Setup([Values(0, 1)] int x)
{
m_a = new A(x);
m_b = new B(m_a);
}