繁体   English   中英

应该和Json.NET:这通过?! JToken.Parse(“{}”)shouldBe这样(“你好”)。

[英]Shouldly and Json.NET: This passes?! JToken.Parse(“{}”).ShouldBe(“hello”);

任何人都可以解释Newtonsoft.Json.Linq.JToken (来自Json.NET 4.5)和应该 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");

使用从stringJToken的隐式转换运算符 - 所以我们实际上比较了两个JToken ,而不是JTokenstring

这失败是因为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);
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM