NUnit - 等于(this,that),True(this == that)或 That(this,Is.EqualTo(that))?
NUnit - Equal(this, that), True(this == that) or That (this, Is.EqualTo(that))?
我们的内部框架使用通用 class、DBField<T>
来模拟与 Entity Framework(例如 Oracle 11 或 Sybase)不兼容的数据库的实体字段。
我们正在努力使其尽可能透明(同样,就像实体字段一样),以便以下代码可以工作:
DBField<int?> z_intLength = 2;
while (z_intLength <= 5)
{
z_intLength++;
}
//[...]
DBField<int?> z_intMaxLength = 10;
if (z_intLength > z_intMaxLength)
{
}
上面的效果很好。我们使用了 public static implicit operator DBField<T>(T value)
和 public static implicit operator T(DBField<T> value)
,以及覆盖 ==
和其他比较运算符,以及实现 IEquatable<DBField<T>>
、IComparable
和 IComparable<DBField<T>>
.
现在我们正在尝试 DBField<T>
通过 NUnit 测试,我们在这方面还很新。
值得注意的是,我们正在尝试各种等价物:
string z_strComment = "Comment";
_objOrder2.OrderComment = z_strComment;
//[...]
Assert.True("Comment" == _objOrder2.OrderComment);
Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment));
Assert.That(_objOrder2.OrderComment, Is.EqualTo("Comment"));
Assert.Equals("Comment", _objOrder2.OrderComment);
前两个断言通过,后两个断言失败。
每个断言的内部工作原理似乎有所不同。谁能解释一下这是什么?
更准确地说,断点调试似乎表明 Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment))
测试 _objOrder2.OrderComment.Equals("Comment")
;我希望相反。我错过了什么吗?
我知道 True()
和 Equals()
比 That()
大。哪些在哪些情况下更可取?
这里有两件事在起作用:
- 如果测试失败,来自 NUnit 的错误消息有多大用处
- 您使用的是哪种 NUnit API
Assert.True("Comment" == _objOrder2.OrderComment)
如果此测试失败,您会收到类似“预期为真,结果为假”的消息。没有帮助,因为它没有告诉您 _objOrder2.OrderComment
的实际值是多少。
Assert.Equals("Comment", _objOrder2.OrderComment);
Assert.That(_objOrder2.OrderComment, Is.EqualTo("Comment"));
这两个是等价的,第一个使用稍微短一点的语法,第二个使用更可扩展的constraint model(你可以写自己的断言,例如Assert.That(x, new MyConstraint(y))
)。
如果测试失败,您将得到类似 Expected "Comment", was "Actual Value"
的信息。这更有帮助。
Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment));
这个倒退了。如果失败,您将得到类似 Expected "Actual Value", was "Comment"
的内容,这是错误的。
关于旧式 Assert.Equals
与约束模型 Assert.That
,这(恼人地)取决于个人喜好。我个人使用 Assert.Equals
因为我觉得它更容易阅读,但是在对集合进行断言时我会使用 Assert.That
而不是 CollectionAssert
,并且在编写自己的断言时我也会使用它.
阅读下面一位 NUnit 开发人员的评论,了解他们如何发现用户更容易理解 Assert.That
风格。
我们的内部框架使用通用 class、DBField<T>
来模拟与 Entity Framework(例如 Oracle 11 或 Sybase)不兼容的数据库的实体字段。
我们正在努力使其尽可能透明(同样,就像实体字段一样),以便以下代码可以工作:
DBField<int?> z_intLength = 2;
while (z_intLength <= 5)
{
z_intLength++;
}
//[...]
DBField<int?> z_intMaxLength = 10;
if (z_intLength > z_intMaxLength)
{
}
上面的效果很好。我们使用了 public static implicit operator DBField<T>(T value)
和 public static implicit operator T(DBField<T> value)
,以及覆盖 ==
和其他比较运算符,以及实现 IEquatable<DBField<T>>
、IComparable
和 IComparable<DBField<T>>
.
现在我们正在尝试 DBField<T>
通过 NUnit 测试,我们在这方面还很新。
值得注意的是,我们正在尝试各种等价物:
string z_strComment = "Comment";
_objOrder2.OrderComment = z_strComment;
//[...]
Assert.True("Comment" == _objOrder2.OrderComment);
Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment));
Assert.That(_objOrder2.OrderComment, Is.EqualTo("Comment"));
Assert.Equals("Comment", _objOrder2.OrderComment);
前两个断言通过,后两个断言失败。
每个断言的内部工作原理似乎有所不同。谁能解释一下这是什么?
更准确地说,断点调试似乎表明
Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment))
测试_objOrder2.OrderComment.Equals("Comment")
;我希望相反。我错过了什么吗?我知道
True()
和Equals()
比That()
大。哪些在哪些情况下更可取?
这里有两件事在起作用:
- 如果测试失败,来自 NUnit 的错误消息有多大用处
- 您使用的是哪种 NUnit API
Assert.True("Comment" == _objOrder2.OrderComment)
如果此测试失败,您会收到类似“预期为真,结果为假”的消息。没有帮助,因为它没有告诉您 _objOrder2.OrderComment
的实际值是多少。
Assert.Equals("Comment", _objOrder2.OrderComment);
Assert.That(_objOrder2.OrderComment, Is.EqualTo("Comment"));
这两个是等价的,第一个使用稍微短一点的语法,第二个使用更可扩展的constraint model(你可以写自己的断言,例如Assert.That(x, new MyConstraint(y))
)。
如果测试失败,您将得到类似 Expected "Comment", was "Actual Value"
的信息。这更有帮助。
Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment));
这个倒退了。如果失败,您将得到类似 Expected "Actual Value", was "Comment"
的内容,这是错误的。
关于旧式 Assert.Equals
与约束模型 Assert.That
,这(恼人地)取决于个人喜好。我个人使用 Assert.Equals
因为我觉得它更容易阅读,但是在对集合进行断言时我会使用 Assert.That
而不是 CollectionAssert
,并且在编写自己的断言时我也会使用它.
阅读下面一位 NUnit 开发人员的评论,了解他们如何发现用户更容易理解 Assert.That
风格。