2013-05-10 52 views
2
interface IPoint 
{ 
    int X { get; } 
    int Y { get; } 
} 

static bool CoincidesWith(this IPoint self, IPoint other); // implementation unknown 

我想寫一個NUnit的測試驗證有關的CoincidesWith意思我的假設:使用Assert.That(而不是假設)與[Theory]是否是錯誤的?

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.That,而不是Assume.That? (The documentation seems to suggest that the latter should be used in conjunction with [Theory].
  2. 這種情況確實更適合[Theory]而不是[Test]

回答

1

經過一番思考後,我得出結論:我的上述解決方案沒有任何問題。

是這種情況下的確更適合[Theory]而不是[Test]

如果用於CoincidesWith方法的實現是可用的檢查(如源代碼),或者至少充分證明,那麼就沒有必要做假設—我可以簡單地查找我需要什麼知道。在這種情況下,[Test] —或xUnit.net稱爲測試,[Fact] —似乎更合適。

但是由於我無法訪問CoincidesWith的實現,並且文檔不足,所以我需要對該方法的一般工作做一些假設或[Theory]

隨着[Theory],是不是算錯了,還是壞的風格,使用Assert.That,而不是Assume.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) { … } 
相關問題