【问题标题】:Use Values- and Range-Attribute in NUnit TestFixture constructor在 NUnit TestFixture 构造函数中使用 Values- 和 Range-Attribute
【发布时间】:2016-05-29 11:43:02
【问题描述】:

我有多种测试方法可以测试多个参数的所有可能组合。我可以在这样的方法上使用 NUnit ValueAttributeRangeAttribute

[TestFixture]
public class MyExampleTests
{
    [Test]
    public void TestedEntity_GivenParemeter_Passes(
        [Values(1, 2)] int inputA,
        [Range(1, 4)] int inputB)
    {
        if (inputA > 0 && inputB > 0)
            Assert.Pass();
    }
}

但是,在我的实际案例中,有 4 个参数、十几个方法和更多值,因此为每个方法写出所有值变得乏味,如果我想进行更改,我可能会犯错误某处。

如何将所有值组合的测试生成从单个方法移到 TestFixture 主体中?以下内容不起作用,但这正是我想要的:

[TestFixture]
public class MyExampleTests2
{
    readonly int inputA;
    readonly int inputB;

    public MyExampleTests2(
        [Values(1, 2)] int inputA,
        [Range(1, 4)] int inputB)
    {
        this.inputA = inputA;
        this.inputB = inputB;
    }

    [Test]
    public void TestedEntity_GivenParemeter_Passes()
    {
        if (this.inputA > 0 && this.inputB > 0)
            Assert.Pass();
    }
}

我已经知道 TestFixtureAttribute 可以接受参数,但它们不能按我想要的方式工作。我只能给每个参数一个硬编码的值。相反,我想使用范围,并让 NUnit 为每个组合创建一个测试。另外,我希望该解决方案适用于 NUnit 2.6.4。

【问题讨论】:

    标签: c# nunit parameterized-unit-test nunit-2.6


    【解决方案1】:

    你可以使用ValuesSource:

    [Test]
    public void TestedEntity_GivenParemeter_Passes(
        [ValueSource(nameof(FirstSource))] int inputA,
        [ValueSource(nameof(SecondSource))] int inputB)
    {
        if (inputA > 0 && inputB > 0)
            Assert.Pass();
    }
    
    private static readonly int[] FirstSource = { 1, 2 };
    private static readonly IEnumerable<int> SecondSource = Enumerable.Range(1, 4);
    

    如果您想避免重复参数声明,您可以创建一个包含 InputAInputB 属性的单一类型,以及返回该类型序列的源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多