![](/img/trans.png)
[英]NUnit: Assert.Multiple for methods that contain Assume.That
[英]Is it wrong to use Assert.That (rather than Assume.That) with a [Theory]?
interface IPoint
{
int X { get; }
int Y { get; }
}
static bool CoincidesWith(this IPoint self, IPoint other); // implementation unknown
我想编写一个NUnit测试,以验证我对CoincidesWith
含义的假设:
self.CoincidesWith(other)
⇔(self.X
=other.X
)∧(self.Y
=other.Y
)
以下是到目前为止我能提出的最简洁的测试:
[Theory]
void CoincidesWith_Iff_CoordinatesAreEqual(IPoint self, IPoint other)
{
bool coordinatesAreEqual = (self.X == other.X && self.Y == other.Y);
Assert.That(self.CoincidesWith(other) == coordinatesAreEqual);
}
我的问题按重要性从高到低依次为:
[Theory]
,使用Assert.That
代替Assume.That
是否被认为是错误的或不良的风格? ( 文档似乎建议后者应与[Theory]
结合使用。 ) [Test]
更适合[Theory]
[Test]
吗? 经过一番思考后,我得出的结论是我的上述解决方案没有任何问题。
这种情况确实比
[Test]
更适合[Theory]
[Test]
吗?
如果CoincidesWith
方法的实现可用于检查(例如,作为源代码),或者至少有充分的文献证明,则无需进行假设-我可以简单地查找我需要知道的内容。 在这种情况下, [Test]
(或xUnit.net称测试为[Fact]
)似乎更合适。
但是,由于我无法访问CoincidesWith
的实现,并且文档不足,因此,我确实需要对该方法的一般工作作一些假设或[Theory]
。
使用
[Theory]
,使用Assert.That
代替Assume.That
是否被认为是错误的或不良的风格?
否。它只是要使用的另一种工具,而且比Assert.That
少Assert.That
。
在[Theory]
的上下文中, Assume.That
这似乎是对所提供的[Datapoints]
施加附加约束的正确方法,同时验证了实际假设(使用使它们超出Assume.That
那些数据点)。 Assert.That
。
一个例子可以说明这一点。 让我们尝试为此假设编写一个测试:
给定一个偶数整数
a
和一个奇数整数b
,它们的乘积a * b
是偶数。
仅当满足前提条件时,才测试a * b
是否有意义。 如果a
不是一个偶数整数,或者b
不是一个奇数整数,则测试既不应成功也不应该失败; 应该没有定论。 而这正是Assume.That
。这有助于实现。 但是,实际测试留给Assert.That
:
[Theory]
void GivenAnEvenIntegerAndAnOddInteger_ProductIsAnEvenInteger(int a, int b)
{
Assume.That(a.IsEven());
Assume.That(b.IsOdd());
// note: the type system already ensures that `a` and `b` are integers.
int product = a * b;
Assert.That(product.IsEven());
// note: the theory doesn't require `product` to be an integer, so even
// if the type system didn't already assert this, we would not test for it.
}
[Datapoints]
int[] integers = { 1, 2, 3, 4, 5, 6, 7 };
static bool IsEven(this int integer) { … }
static bool IsOdd(this int integer) { … }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.