使用AssertWasCalled测试浮点相等性

时间:2014-04-24 19:37:08

标签: c# floating-point rhino-mocks

我的测试以此结束:

model.AssertWasCalled(m => m.CalculateBeta(
    Arg<double>.Is.Equal(50),
    Arg<double>.Is.Equal(3.74593228));

我想使用像Microsoft.VisualStudio.TestTools.UnitTesting.Assert

中提供的delta值来测试它。
Assert.AreEqual(3.745932, result, 0.000001);

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

是的,有一种更简单的方法:

test.AssertWasCalled(
    t => t.CalculateBeta(
        Arg<double>.Matches(a => Math.Abs(a - 50) < 0.01),
        Arg<double>.Matches(b => Math.Abs(b - 3.74593228) < 0.000001)
    )
);

实际上,您可以将任何谓词传递给Arg<T>.Matches()以特别验证每个参数。

答案 1 :(得分:0)

我想出了这个暴行。很想看到一些更好的解决方案。

var values = new List<Tuple<double, double>>
{
    Tuple.Create(50.0, 0.1),
    Tuple.Create(3.745932, 0.000001),
};
Predicate<double> expected = (x) =>
{
    var value = values[0];
    values.RemoveAt(0);

    Assert.AreEqual(value.Item1, x, value.Item2);
    return true;
};
model.AssertWasCalled(m => m.CalculateBeta(
    Arg<double>.Matches((x) => expected(x)),
    Arg<double>.Matches((x) => expected(x));