2

我刚刚写了一个小单元测试,我在其中使用了StringBuilder().

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

Assert.AreEqual(stringBuilder, "Foo");

此测试将失败。

Expected: <Foo>
But was:  "Foo"

但是,如果我将断言更改为

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

测试将通过。

那么,方法的隐式调用和显式调用有什么区别ToString()呢?或者/这些括号 ( <>) 代表什么?

4

2 回答 2

6

在您的第一个示例中,您正在测试您的StringBuilder 实例是否等于字符串,这将失败。

在您的第二个中,您正在测试调用的结果ToString()(它是一个字符串)是否等于另一个字符串。


括号 (<>) 是 NUnits 的方式,表示它得到了一个非字符串对象,但为了显示消息,NUnit 调用ToString()该对象。

Expected: <Foo> But was: "Foo"

一个在调用时<Foo>返回的对象也是如此,而只是一个FooFooToString()"Foo"String

MSTest 会向您显示一条不同的消息,这会更清楚:

Expected:<Foo (System.Text.StringBuilder)>. Actual:<Foo (System.String)>.   
于 2012-08-07T11:21:19.030 回答
0

在第一个版本中,没有对 ToString 的隐式调用 。这只发生在 Console.WriteLine 等方法中。

所以实际发生的事情是您将 stringbuilder 对象等同于 string 对象。甚至类型也不匹配:-)

于 2012-08-07T11:23:03.527 回答