使用 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
成为一个不可变结构,其构造函数采用 x
和 y
并且没有设置器,这使得一切都更加清晰,尤其是对于结构。
我在 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
成为一个不可变结构,其构造函数采用 x
和 y
并且没有设置器,这使得一切都更加清晰,尤其是对于结构。