2012-08-07 29 views
1

我剛剛寫了一個小單元測試,其中我使用了一個StringBuilder。隱式與顯式StringBuilder.ToString()cethod調用

var stringBuilder = new StringBuilder(); 
stringBuilder.Append("Foo"); 

Assert.AreEqual(stringBuilder, "Foo"); 

此測試將失敗。

Expected: <Foo> 
But was: "Foo" 

但是,如果我改變斷言到

Assert.AreEqual(stringBuilder.ToString(), "Foo"); 

測試將通過。

那麼隱式調用和ToString()方法的顯式調用之間有什麼區別?或者/這些括號(<>)代表什麼?

+1

有沒有隱式調用ToString? – RvdK 2012-08-07 11:23:21

回答

6

在您的第一個示例中,您正在測試您的StringBuilder實例是否等於字符串,這將失敗。

在第二個中,您正在測試對ToString()(它是一個字符串)的調用結果是否與另一個字符串相等。


的bracktes(<>)是NUnits方式,以指示它有一個非字符串對象,但顯示該消息,NUnit的該對象上調用ToString()

Expected: <Foo> But was: "Foo" 

所以<Foo>是上ToString()一個調用返回Foo的對象,而"Foo"只是一個String

MSTest的會告訴你一個不同的信息,這將是更加清晰:

Expected:<Foo (System.Text.StringBuilder)>. Actual:<Foo (System.String)>. 
0

在第一個版本有是的ToString 沒有隱式調用這只是發生在像Console.WriteLine方法。

所以實際發生的是,您將stringbuilder對象等同於一個字符串對象。即使類型不匹配:-)

+0

我明白了。認爲這種隱式調用每次都會進行,因爲它適用於像WriteLine或String.Format(「foo {0} bar」,sb)這樣的方法。但是,當我重申它只是Object.ToString()調用這個技巧..(和AreEqual不這樣做) – Martin 2012-08-07 12:46:51