2
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);
}

私の質問は、重要度の高い順に次のとおりです。

  1. の代わりに[Theory]を使用するのは、間違っている、または悪いスタイルと見なされますか? (ドキュメンテーションは、後者を と組み合わせて使用​​することを示唆しているようです。 )Assert.ThatAssume.That[Theory]
  2. [Theory]このケースは実際に aよりも aに適してい[Test]ますか?
4

1 に答える 1

1

もう少し考えた結果、上記の解決策には何の問題もないという結論に達しました。

[Theory]このケースは実際に aよりも aに適してい[Test]ますか?

メソッドの実装がCoincidesWith(たとえば、ソース コードとして) 検査に利用できるか、少なくとも十分に文書化されている場合、仮定を行う必要はありません。知る必要があることを簡単に調べることができます。その場合、a [Test]— または、xUnit.netがテストを呼び出すように、a [Fact]— がより適切に思えます。

しかし、私は の実装にアクセスすることができず、ドキュメントも不十分であるため、メソッドの一般的な動作についてCoincidesWith何らかの仮定または を行う必要があります。[Theory]

の代わりに[Theory]を使用するのは、間違っている、または悪いスタイルと見なされますか?Assert.ThatAssume.That

いいえ。これは使用するツールの 1 つにすぎませんAssert.That

a のコンテキストでは[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) { … }
于 2013-05-10T20:02:10.200 に答える