[英]What is the difference between STAssertEqualObjects and STAssertEquals?
[英]STAssertEquals reports equal strings as being different
我試圖為一個庫編寫單元測試。 庫中的方法返回字符串,我想確保它返回正確的字符串。 但是,即使相同,SenTestKit中的STAssertEquals
宏還是將其視為不同的值。
您可以看到描述部分清楚地顯示了兩個字符串值相同,但是此宏抱怨它們的值不同。 當我從方法返回靜態字符串時(就像return @"op_user"
),它通過了測試用例。 任何人都知道導致相同字符串值的測試失敗的原因是什么?
我認為您想使用STAssertEquals()而不是STAssertEquals() 。 前者用於Objective-C實例,后者用於基本類型。
從文檔 :
STAssertEqualObjects
當兩個對象不同時,測試用例失敗。
STAssertEquals
兩個值不同時,測試用例失敗。
如果將Objective-C對象與STAssertEquals()比較,則只是在比較它們的指針值。 它們可以指向包含相同字符串的兩個不同的字符串對象。 即使它們的指針值不同,您也希望它們比較相等。
要比較實際的字符串內容,可以使用isEqual:方法,這正是STAssertEqualObjects()的作用。
這不是一個完全的答案(因為Marc已經正確回答了),但是作為一般規則,永遠不要使用STAssertEquals
!
它使用一種可疑的方法,該方法首先檢查參數的類型是否相等,然后使用@encode
確定類型,然后基本上執行memcmp。 因此,變量定義如下
int i = 1;
unsigned int ui = 1;
assert(i == ui);
STAssertEquals(i, ui, @"");
即使值相等,也會使STAssertEquals
失敗。
而
signed char sc = 1;
char c = 1;
STAssertEquals(sc, c, @"");
你猜怎么了?
(提示:類型不相等!)
...將成功 ,因為@encode
無法區分unsigned char
和已signed char
,但這是不同的類型!
其他問題與結構中的填充有關,其中memcmp
可能返回非零值,但結構值實際上會比較相等。
因此最好不要使用STAssertEquals
以及它的后繼者XCTAssertEqual
,后者采用相同的荒謬方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.