2011-02-24 19 views
1

當我創建一個PUT,調用待測試類的方法並將它歸屬於PexMethod時,「Run Pex」將使用此方法併爲其創建自動生成的測試。PexAssert.Throws與PUT結合運行Pex

只有在對方法的調用直接在PUT的主體中時,這才起作用。

樣品:

這個PUT所使用的 「運行Pex的」:

[PexGenericArguments(typeof(string))] 
[PexGenericArguments(typeof(int))] 
[PexGenericArguments(typeof(object))] 
[PexMethod] 
public string Convert01_ConverterForTypeNotRegistered<T>(
    [PexAssumeUnderTest] ToStringConverter target, T objectToConvert) 
{ 
    var result = ""; 
    result = target.Convert(objectToConvert); 
    return result; 
} 

這PUT是 「運行Pex的」 使用

[PexGenericArguments(typeof(string))] 
[PexGenericArguments(typeof(int))] 
[PexGenericArguments(typeof(object))] 
[PexMethod] 
public string Convert01_ConverterForTypeNotRegistered_ThrowsInvalidOperationException<T>(
    [PexAssumeUnderTest] ToStringConverter target, T objectToConvert) 
{ 
    var result = ""; 
    PexAssert.Throws<InvalidOperationException>(() => target.Convert(objectToConvert)); 
    return result; 
} 

我想表明對該方法的調用總是拋出此異常,而與參數無關。

如何實現這一目標?

我已經問了question一個星期前在official Pex forum of Microsoft但沒有收到一個單一的答案,因此我在這裏做一個雙重職位。

問題可以重現類似如下:

  1. 有一個簡單的解決方案有一個項目,一個類的方法。
  2. 右鍵單擊該方法並選擇Run Pex。
  3. 在Pex Exploration Results中,右鍵單擊任意條目並選擇「保存測試...」。它將創建一個包含兩個相關文件的新測試項目:<class-name>Test.cs<class-name>Test.<MethodName>.g.cs。在第一個文件中,有PUT,第二個文件中是特定的測試方法,Pex選擇每個參數。第二個文件會在您每次運行pex時自動重新創建第一個文件中具有PUT的方法。
  4. 右鍵單擊測試項目並選擇「Pex」 - >「刪除生成的單元測試」。這將從第二個文件中刪除特定的測試。
  5. 使用PUT轉到文件並將PUT重命名爲任意名稱。
  6. 回到方法1,再次右鍵單擊並選擇運行Pex。
  7. Pex將在名爲`Test..g.cs的測試項目中創建一個新文件。它使用與以前相同的PUT,儘管您重命名了它。
  8. 通過保留名稱,但將內容更改爲使用PexAssert.Throws的第二個示例,再次更改PUT。
  9. 再次右擊測試項目並選擇「Pex」 - >「刪除生成的單元測試」。
  10. 同樣,在點1的方法中右鍵單擊並選擇「Run Pex」
  11. 在測試項目中打開兩個* .g.cs文件,您將看到沒有測試。這意味着,Pex沒有使用PUT。這就是問題:)

回答

0

我只是試圖在Visual Studio 2010中運行你的兩個例子。我改變了第二個例子使用一個名爲ThrowingConverter類,這些都是我的傻實現:

public class ToStringConverter { 
    internal string Convert(object objectToConvert) { 
     return objectToConvert.ToString(); 
    } 
} 

public class ThrowingConverter { 
    internal string Convert(object objectToConvert) { 
     if (objectToConvert is string) { 
      return (string)objectToConvert; 
     } 
     throw new InvalidOperationException(); 
    } 
} 

我跑PEX,並想出了下面的測試情況:

  • ToStringConverter
    • int
      • 0
      • 1
    • string
      • null(失敗NullReferenceException
      • ""
    • object
      • null(失敗NullReferenceException
      • new object()
  • ThrowingConverter
    • int
      • 0
    • string
      • null
      • ""(失敗,因爲它返回""
    • object
      • null
      • ""(失敗,因爲它返回""

這正是我期望找到的,所以我沒有真正看到你的問題。

+0

感謝您的關注。也許我並不完全清楚問題是什麼:當您從方法中選擇「運行Pex」時,Pex將搜索使用該方法的參數化單元測試(PUT)。如果它找到一個這樣的PUT,它會使用它爲每個測試用例創建特定的單元測試。在那個PUT中,你可以定義獨立於輸入參數的斷言。當PUT看起來像我的第一個例子時,Pex使用它。當它看起來像我的第二個例子時,Pex沒有使用它,因爲它沒有意識到,這段代碼調用了我想測試的方法。 – 2011-03-24 09:44:48

+0

@Daniel:我嘗試了右鍵單擊這兩種方法並選擇「運行Pex」,並且在兩種情況下它都沒有使用PUT。我做錯了嗎?(當我在他們的項目中運行Pex Explorations時,我的測試運行正常) – configurator 2011-03-24 22:39:03

+0

我更新了我的問題以提供再現步驟。 – 2011-03-25 07:52:15