【发布时间】:2014-01-28 00:35:15
【问题描述】:
我有一个检查项目是否正确序列化的测试
public interface IMyJsIdentity
{
string Forename { get; }
string Surname { get; }
string Guid { get; }
}
public class MyIdentity : IMyJsIdentity
{
public string Forename { get; set; }
public string Surname { get; set; }
public string Guid { get; set; }
public int Id { get; set; }
}
[Fact]
public void SerialiseCorrectly()
{
// Arrange
MyIdentity identity = new MyIdentity()
{
Forename = "forename",
Surname = "surname",
Guid = "abcdefghijk"
};
// Act
string result = JsonConvert.SerializeObject(
identity,
new JsonSerializerSettings()
{
ContractResolver = new InterfaceContractResolver(typeof(IMyJsIdentity))
});
// Assert
result.Should().Be(
"{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}"
);
}
但是我在测试失败时收到以下错误
Xunit.Sdk.AssertException: Expected string to be
"{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}" with a length of 66, but
"{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}" has a length of 64.
Json.net 显然对字符串做了一些特别的事情,但我不知道是什么。
奇怪的是通过了
result.Should().Be(
String.Format("{{\"Forename\":\"forename\",\"Surname\":\"surname\",\"Guid\":\"abcdefghijk\"}}")
);
我想这没什么大不了的,但我想知道为什么。
【问题讨论】:
-
尝试调试它并查看两个字符串的内部 char 数组,这可能会让您知道可能出了什么问题。
-
我想问题出在你的 '.Should().Be()' 方法上。这些字符串的长度完全相同,但报告它们不同。可能是因为较长的那个算引号?
-
有任何理由拥有双
{{和}}?如果在某个地方对该字符串进行了String.Format调用,它会将它们转换为单个花括号。这也可能是输出消息/错误中的一些错误信息,放置了额外的花括号。编辑:同样,如果您不使用String.Format调用,那么双括号根本不能用作转义字符,除非您打算使用 2 个大括号,否则不应将它们加倍。
标签: c# json.net string-comparison xunit fluent-assertions