NUnit为什么没有IsElementOf / IsOneOf约束?

| 我不是直接与NUnit合作,而是希望在不同的背景下借鉴其一些想法。 一个特别好的主意是约束机制,它使您可以编写表单的单元测试:
Assert.That(aValue, Is.GreaterThan(2.0) & Is.LessThan(5.0));
您还可以测试值是否在某个范围内:
Assert.That(aValue, Is.InRange(2.0, 5.0));
但是,似乎没有办法测试test2ѭ是允许值集合之一:
Assert.That(aValue, Is.OneOf(aCollection));
这在单元测试中不是很常见吗?这是否表明我的单元测试有问题? 每个人都只是将aValue注入一些虚拟的element集合中,然后使用
Is.SubsetOf
吗?     
已邀请:
        @Lambdageek;
Assert.That(aCollection, Has.Member(aValue) 
Assert.That(aCollection, Has.No.Member(aValue) 
已经有一段时间了。还有很多其他有用的收集约束,在此有据可查。 除了可读性外,如果出现故障,您还将获得更有用的反馈。海事组织值得付出微不足道的额外努力。 编辑
    [Test]
    public void Test() {
        var c = new[] {\"one\", \"two\"};
        Assert.That(c, Has.Member(\"three\"));
    }

Test failed:
  Expected: collection containing \"three\"
  But was:  < \"one\", \"two\" >
    Tests.cs(73,0): at ...Test()
干杯, 贝里 可怜的人的约束
public static class TestExtensions
{
    public static bool IsOneOf<T>(this T candidate, IEnumerable<T> expected) {
        if (expected.Contains(candidate)) return true;

        var msg = string.Format(\"Expected one of: \'{0}\'. Actual: {1}\", \", \"._insertBetween(expected.Select(x => Convert.ToString(x))), candidate);
        Assert.Fail(msg);
        return false;
    }

    private static string _insertBetween(this string delimiter, IEnumerable<string> items)
    {
        var builder = new StringBuilder();
        foreach (var item in items)
        {
            if (builder.Length != 0)
            {
                builder.Append(delimiter);
            }
            builder.Append(item);
        }
        return builder.ToString();
    }

    internal static IEnumerable<string> GenerateSplits(this string str, params char[] separators)
    {
        foreach (var split in str.Split(separators))
            yield return split;
    }

}
测试失败
    [Test]
    public void IsOneOf_IfCandidateNotInRange_Error()
    {
        IEnumerable<string> expected = new[] { \"red\", \"green\", \"blue\" };
        const string candidate = \"yellow\";
        Assert.That(candidate.IsOneOf(expected));
    }

IsOneOf_IfCandidateNotInRange_Error\' failed:
Expected one of: \'red, green, blue\'. Actual: yellow
    
        断言API都是关于可读性的,对此具有Is.OneOf(collection)的可读性没有任何好处:
Assert.That(collection.Contains(value));
它清晰易读,因此如果没有带来任何好处,则在Assersion API中复制每种情况都是不正确的。据您所知,没有简单的方法可以替代Is.InRange和Is.GreaterThan + Is.LessThan替代
Assert.That(value > 2.0 && value < 5.0);
//compared to
Assert.That(value, Is.GraterThan(2.0).And.Is.LessThan(5.0));
    

要回复问题请先登录注册