在Nunit中对某些测试进行参数化设置,但对其他测试不进行参数化设置



假设我的System Under Test中有类AB:

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_am_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);
}

相关内容

  • 没有找到相关文章

最新更新