谁能解释Newtonsoft.Json.Linq.JToken
(从 Json.NET 4.5开始)和Shouldly 1.1.1.1之间的这种奇怪的相互作用?
下面是完整的 C# 代码:
using Newtonsoft.Json.Linq;
using NUnit.Framework;
using Shouldly;
public class Tests
{
[Test]
public void this_test_passes()
{
JToken.Parse("{}").ShouldBe("hello");
}
}
注意:字符串"hello"
不是特殊的,它可以是任何字符串。
我猜这与隐式转换为某种类型有关,该类型覆盖Equals(...)
以对所有字符串返回 true,或者其他什么。但这是我能做的最好的事情,谁能解释一下这里到底发生了什么?
编辑:我已经为这个问题提交了补丁,如果它被合并到master中,将再次更新。
更新:已修复下一版本的问题... :)https://github.com/shouldly/shouldly/issues/65#issuecomment-34579229
请注意,此的泛型类型解析提供:
JToken.Parse("{}").ShouldBe<JToken>("hello");
使用从 string
到 JToken
的隐式转换运算符 - 所以我们实际上是在比较两个JToken
,而不是一个JToken
和一个string
。
这失败了,因为JToken : IEnumerable<JToken>
,指的是子令牌。因此,NUnit 决定仅执行序列相等性测试。对于这两个,没有子序列:
JToken x = JToken.Parse("{}");
Console.WriteLine(x.Any()); // False
JToken y = "hello";
Console.WriteLine(y.Any()); // False
两个空序列通常被认为是相等的。
有关信息(来自元数据,而不是来源):
public abstract class JToken : IJEnumerable<JToken>,
System.Collections.Generic.IEnumerable<JToken>, IEnumerable,
IJsonLineInfo, ICloneable, IDynamicMetaObjectProvider
{
// ...
public static implicit operator JToken(string value);
// ...
}