隐式与显式StringBuilder.ToString()cethod调用

Mar*_*tin 1 c# stringbuilder unit-testing tostring implicit-conversion

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

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

Assert.AreEqual(stringBuilder, "Foo");
Run Code Online (Sandbox Code Playgroud)

此测试将失败.

Expected: <Foo>
But was:  "Foo"
Run Code Online (Sandbox Code Playgroud)

但是,如果我将Assert更改为

Assert.AreEqual(stringBuilder.ToString(), "Foo");
Run Code Online (Sandbox Code Playgroud)

测试将通过.

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

slo*_*oth 6

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

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


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

Expected: <Foo> But was: "Foo"
Run Code Online (Sandbox Code Playgroud)

所以<Foo>是一个Foo在调用时返回的对象ToString(),而"Foo"只是一个String Foo.

MSTest会向您显示不同的消息,这将更加清晰:

Expected:<Foo (System.Text.StringBuilder)>. Actual:<Foo (System.String)>.   
Run Code Online (Sandbox Code Playgroud)