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但沒有收到一個單一的答案,因此我在這裏做一個雙重職位。
問題可以重現類似如下:
- 有一個簡單的解決方案有一個項目,一個類的方法。
- 右鍵單擊該方法並選擇Run Pex。
- 在Pex Exploration Results中,右鍵單擊任意條目並選擇「保存測試...」。它將創建一個包含兩個相關文件的新測試項目:
<class-name>Test.cs
和<class-name>Test.<MethodName>.g.cs
。在第一個文件中,有PUT,第二個文件中是特定的測試方法,Pex選擇每個參數。第二個文件會在您每次運行pex時自動重新創建第一個文件中具有PUT的方法。 - 右鍵單擊測試項目並選擇「Pex」 - >「刪除生成的單元測試」。這將從第二個文件中刪除特定的測試。
- 使用PUT轉到文件並將PUT重命名爲任意名稱。
- 回到方法1,再次右鍵單擊並選擇運行Pex。
- Pex將在名爲`Test..g.cs的測試項目中創建一個新文件。它使用與以前相同的PUT,儘管您重命名了它。
- 通過保留名稱,但將內容更改爲使用PexAssert.Throws的第二個示例,再次更改PUT。
- 再次右擊測試項目並選擇「Pex」 - >「刪除生成的單元測試」。
- 同樣,在點1的方法中右鍵單擊並選擇「Run Pex」
- 在測試項目中打開兩個* .g.cs文件,您將看到沒有測試。這意味着,Pex沒有使用PUT。這就是問題:)
感謝您的關注。也許我並不完全清楚問題是什麼:當您從方法中選擇「運行Pex」時,Pex將搜索使用該方法的參數化單元測試(PUT)。如果它找到一個這樣的PUT,它會使用它爲每個測試用例創建特定的單元測試。在那個PUT中,你可以定義獨立於輸入參數的斷言。當PUT看起來像我的第一個例子時,Pex使用它。當它看起來像我的第二個例子時,Pex沒有使用它,因爲它沒有意識到,這段代碼調用了我想測試的方法。 – 2011-03-24 09:44:48
@Daniel:我嘗試了右鍵單擊這兩種方法並選擇「運行Pex」,並且在兩種情況下它都沒有使用PUT。我做錯了嗎?(當我在他們的項目中運行Pex Explorations時,我的測試運行正常) – configurator 2011-03-24 22:39:03
我更新了我的問題以提供再現步驟。 – 2011-03-25 07:52:15