使用 FsCheck 的参考测试总是不起作用

Reference Test using FsCheck always do not work

我在 C# 上使用 FsCheck 时遇到了一些问题。 C# 版本为 7.0.

使用 Fscheck 时,参数在设置为其他对象时表现得好像它们具有相同的值。

请看下面的代码。

[Property]
public Property CorrectTest(int x, int y)
{
    return ( x == y ).ToProperty();
}

[Property]
public Property WrongTest(double x, double y)
{
    Values values = new Values();
    SetMethod(values, x, y);

    // "True" is always shown
    return ( Double.Equals(values.x, values.y) ).ToProperty();
}

public struct Values
{
    public double x { get; set; }
    public double y { get; set; }
}

private void SetMethod(Values values, double x, double y)
{
    values.x = x;
    values.y = y;
}

如果我执行 CorrectTest,测试失败,因为 x 始终等于 y 是不正确的。

另一方面,如果我执行 WrongTest,测试总是通过。 完全错了,但是测试也查不出问题

如果知道相关资料和解决方法,能否教教一下?

谢谢。

看起来是因为 Values 是一个结构,即值类型,即 values 参数是 copied 当你将它传递给 SetMethod。因此,WrongTest 中的原始 values 变量永远不会被修改。

尝试内联 SetMethod,或通过引用传递 values(使用 ref 关键字)。

还可以考虑使 Values 成为一个不可变结构,其构造函数采用 xy 并且没有设置器,这使得一切都更加清晰,尤其是对于结构。