0

在测试期间,我有几个特定于项目的 Assert 辅助函数。例如,我必须经常检查两个 IEnumerables 是否相等(通过引用完全相同的内容,而不是关于顺序)。所以有一个静态类。例如:

internal static class MyAssert
{
    public static void AreEquivalent<T>(IEnumerable<T> enumerable1, IEnumerable<T> enumerable2)
    {
        bool val = false;
        if (enumerable2 == null)
        {
            val = !enumerable1.Any();
        } else {
            var list1 = enumerable1.ToList();
            var list2 = enumerable2.ToList();

            val = (list1.Count == list2.Count && list1.Intersect(list2).Count() == list2.Count());
        }

        Assert.IsTrue(val);
    }
}

然后,如果我使用MyAssert.AreEquivalent(enumer1, enumer2);,但它失败了,那么整个堆栈跟踪将显示在辅助函数中。我想错过它,所以如果开发人员来了,并且看到了 assert 的来源,他只看到 MyAssert 失败了,但他没有看到我的辅助函数内部的问题在哪里(他无法对Assert.IsTrue(val)).

我知道它可以用 来完成Assert.IsTrue(MyCollHelper.AreEquivalent(enumer1, enumer2)),但这不像以前那样可读。

4

2 回答 2

0

不幸的是,现在这是不可能的。

于 2013-07-18T10:51:50.830 回答
0

我不确定我是否理解正确。如果您或开发人员会看到您的方法的哪一部分导致错误,而不是使用Assert.Fail(). 我没有测试它:

internal static class MyAssert
{
public static void AreEquivalent<T>(IEnumerable<T> enumerable1, IEnumerable<T> enumerable2)
{
    bool val = false;
    if (enumerable2 == null)
    {
        val = !enumerable1.Any();

        if (val == false)
        {
            Assert.Fail("enumerable2 is empty, enumerable1 is not");
        }
    }
    else if (enumerable1 == null)
    {
        val = !enumerable2.Any();

        if (val == false)
        {
            Assert.Fail("enumerable1 is empty, enumerable2 is not");
        }
    }
    else
    {
        var list1 = enumerable1.ToList();
        var list2 = enumerable2.ToList();

        if (list1.Count != list2.Count)
        {
            Assert.Fail("Count result is not the same");
        }

        if (list1.Intersect(list2).Count() != list2.Count())
        {
            Assert.Fail("count of Intersect enumerable1 is not the same as enumerable2 count");
        }
    }
}
}
于 2013-05-11T11:54:27.663 回答