如何通过为AreEqual添加新的静态重载来扩展NUnit Assert类?

Dav*_*nan 15 c#

我目前正在为我的产品的DLL开发一个C#P/invoke包装器.我没有C#的经验,这是我做过的第一个重要的C#编码.我敏锐地意识到我对语言的细节和习语缺乏了解.

我的问题涉及我正在编写的单元测试,我使用的是NUnit.我需要比较double[]变量的值.如果我Assert.AreEqual(...)这样做,那么比较值是否完全相等.但是,我想比较宽容.AreEqual()允许delta参数的标量实数值存在重载.但是,我无法找到数组的等价物.我错过了一些明显的事吗?

目前我用以下代码解决了这个问题:

class Assert : NUnit.Framework.Assert
{
    public static void AreEqual(double[] expected, double[] actual, double delta)
    {
        AreEqual(expected.Length, actual.Length);
        for (int i = 0; i < expected.Length; i++)
        {
            AreEqual(expected[i], actual[i], delta);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这似乎有效,但我想知道是否有更清洁的解决方案.特别值得我担心的是,对于我的派生类使用相同的名称,不仅风格很差,而且可能会导致未预料到的问题.

我想要使​​用扩展方法,但我知道它们只适用于扩展时有类的实例.当然,我只在Assert类上调用静态方法.

我很抱歉,如果这看起来有点模糊,但我的直觉告诉我,我不是这样做的最佳方式,我想知道如何做对.

Pet*_*ter 8

自从在NUnit中引入流畅的断言语法以来,该Within()方法就可用于此目的:

double actualValue = 1.989;
double expectedValue = 1.9890;
Assert.That(actualValue, Is.EqualTo(expectedValue).Within(0.00001));
Assert.That(actualValue, Is.EqualTo(expectedValue).Within(1).Ulps);
Assert.That(actualValue, Is.EqualTo(expectedValue).Within(0.1).Percent);
Run Code Online (Sandbox Code Playgroud)

对于集合,默认行为Is.EqualTo()是单独比较集合的成员,并通过修改这些单独的比较Within().因此,您可以比较两个双打数组,如下所示:

var actualDoubles = new double[] {1.0 / 3.0, 0.7, 9.981};
var expectedDoubles = new double[] { 1.1 / 3.3, 0.7, 9.9810};
Assert.That(actualDoubles, Is.EqualTo(expectedDoubles).Within(0.00001));
Assert.That(actualDoubles, Is.EqualTo(expectedDoubles).Within(1).Ulps);
Assert.That(actualDoubles, Is.EqualTo(expectedDoubles).Within(0.1).Percent);
Run Code Online (Sandbox Code Playgroud)

这将使用指定的公差将每个元素actualDoubles与相应元素进行比较expectedDoubles,如果任何元素不够接近,则会失败.