回答
最直接的答案,我能想到的是,當你測試代碼:
Assert.IsNotNull(yourVariable);
您還可以使用Debug.Assert的
System.Diagnostics.Debug.Assert(myBooleanProperty);
谷歌應該給你足夠的例子(提示:類型csharp的例子斷言)
我更喜歡使用單元測試來充實問題。由於我的主要產品是庫/程序集,因此還必須確保參數經過驗證並引發適當的異常。
有趣的消息:Debug.Assert()被髮布版本中的MS C#編譯器捕獲並刪除。
有關於Debug.Assert的的使用()而回了很好的討論:在單元測試中Debug.Assert vs Exceptions
當然。
的外部單元測試,我可以識別3種錯誤(非常簡化)的:
- 重要的內部錯誤:東西,從你的代碼單元的內部,用戶有沒有辦法影響。
- 濫用的一些功能:例如給出一零代替一些值的
- 外部的問題:如不存在的文件,沒有網絡連接,等等
我認爲斷言應當僅施加到第一個。應該使用適當的例外來處理二號和三號。
我真的很喜歡使用Debug.Assert的(),甚至Debug.Fail(),以支持debugtime期間exceptionhandling:
if(!whatever_I_expect)
{
var message = "<exception message>";
Debug.Fail(message);
throw new InvalidOperation(message);
}
這樣,我得到Debug.Assert的的非常方便的對話框(),並能在忽略,重試和中止之間進行選擇。重試將進入可開始調試的代碼。 特別是遞歸方法或複雜的try-catch構造可以通過這種方式更好地調試。你總是得到正確的調用堆棧。而在我的releasecode中,我仍然有一個有效的錯誤處理,沒有消息框。
我經常使用Debug.Assert來檢查我的代碼的先決條件。如果一個對象依賴於另一個對象存在,我可能會斷言這個其他對象不爲null。即使在我將程序交給測試之前,這也會使很多問題可見。
在我想用單元測試檢查的內容和我想在運行時用assertions檢查的內容之間有一條細線。通常,單元測試用於在應用程序的其餘部分處於良好定義的狀態(我廣泛使用mock對象)時測試單個代碼單元,並使用debug.assert在運行時檢查應用程序的狀態是否爲我期望。
有不同的看法(請參閱comp.lang.C++中最近的子線程,主題爲「我們不使用C++異常」)。
我認爲斷言是最好的檢查和記錄你知道不可能是錯誤的東西,除非實現不一致。這比前提條件和不變量更強。
E.g.只能從幾個不同的地方調用的幫助函數具有可用的資源。因爲這個幫助器是私有的,只能在一個類中使用,所以拋出一個ArgumentException並不合適(這是公共/受保護的接口)。
我在代碼中使用了很多的Debug.Assert(),它永遠不會收到一個錯誤/無效的參數 - 輸入參數和因變量應該已被驗證的代碼種類。真相是,我知道我會犯錯。我只是不知道在哪裏。 :-)司法使用「Debug.Assert」幫助我應對我的不完美之處。
下面是我自己的代碼示例:
public bool AddPoint(uint time, object value)
{
bool success = false;
int index = 0;
Debug.Assert(_selectedParameterName != null, "RecipeBusinessObject.InsertPointAtTime() _selectedParameterName = null");
Debug.Assert(_currentRecipe != null, "RecipeBusinessObject.InsertPointAtTime() _currentRecipe = null");
Debug.Assert(CurrentParameterTable != null, "RecipeBusinessObject.InsertPointAtTime() CurrentParameterTable = null");
Debug.Assert(index >= 0, "RecipeBusinessObject.InsertPoint(), index out of range, index = " + index.ToString());
Debug.Assert(index <= CurrentParameterTable.Rows.Count, "RecipeBusinessObject.InsertPoint(), index out of range, index = " + index.ToString());
DataRow newRow = CurrentParameterTable.NewRow();
<snip>
- 1. 在哪裏以及如何在C
- 2. 如何以及在哪裏添加ActionListener在我的代碼中?
- 3. 在哪裏以及如何使用Page.RegisterRequiresViewStateEncryption()?
- 4. 如何以及在哪裏使用instantiateViewControllerWithIdentifier
- 5. 如何以及在哪裏使用Transformations.switchMap?
- 6. 在哪裏以及如何(幾乎)你會在PHP中使用Closure接口?
- 7. 在哪裏以及如何下載MySQL源代碼?
- 8. 如何在nginx中使用.htaccess以及在哪裏放置它?
- 9. 你在哪裏把python代碼掛鉤
- 10. 你在哪裏下載Linux源代碼?
- 11. 你在哪裏使用Python代碼中的生成器功能?
- 12. IndexedDB在哪裏?你如何使用它?
- 13. EmberJs - 如何以及在哪裏學習?
- 14. 在哪裏執行onClickListener以及如何?
- 15. 如何使用facebookAPI以及我在哪裏可以找到它?
- 16. 如何以及在哪裏可以使用Reactive Extensions?
- 17. 你在哪裏使用gSOAP?
- 18. 何時以及爲什麼要在node.js中使用斷言?
- 19. 如何使用getView()方法以及它在哪裏被調用?
- 20. 如何在CodenameOne代碼中使用斷言?
- 21. 你可以在UWP中的C#代碼中使用C++ DLL嗎?
- 22. 在哪裏使用代表在c#
- 23. 如何使用C斷言來使代碼更安全?
- 24. 我們在哪裏以及爲什麼使用界面? C#
- 25. 在哪裏以及如何在PHP文件中添加JavaScript代碼和CSS代碼?
- 26. i18next,語言代碼(ja-JP)從哪裏來?以及如何模擬如果我來自另一種語言?
- 27. 我們在哪裏寫阿賈克斯代碼,以及如何在視圖中使用它
- 28. UWP(C#) - 在哪裏以及如何保存和訪問文件?
- 29. 在哪裏以及如何找到並下載Android 1.5源代碼?
- 30. symfony2:記錄用戶的語言環境如何以及在哪裏存儲?
你能上,爲什麼你需要知道這一點解釋一下?這將有助於解釋這些例子。 – 2009-02-19 14:22:17