【问题标题】:Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken
【发布时间】:2021-06-16 09:17:14
【问题描述】:

我是 C# 新手,正在编写 API 测试。我需要编写将创建新用户的测试。这里是:

        public async Task CreatingNewUser_Returns200()
        {
            string client = BaseClass.mainURL;
            var json = SettingsHelper.ReadSetting("NewUser");
            httpc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(BaseClass.authKey, BaseClass.authValue);
            var content = new StringContent(json);
            var response = await httpc.PostAsync(client, content);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }

另外,我的 SettingsHelper 类有两种方法可以让我的 json 可读:

private static JObject _jObject;

        public static string ReadSetting(string name)
        {
            var parts = name.Split('.', StringSplitOptions.RemoveEmptyEntries);

            JToken token = GetObject();
            foreach (var part in parts)
            {
                token = token[part];
                if (token == null)
                {
                    return null;
                }
            }

            return token.Value<string>();
        }

        private static JObject GetObject()
        {
            if (_jObject != null)
            {
                return _jObject;
            }

            var filename = Path.Combine(
                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!,
                "appsettings.json");
            var json = File.ReadAllText(filename);

            _jObject = JObject.Parse(json);

            return _jObject;
        }

我的用户有 appsettings.json 文件:

 "NewUser": {
    "externalDealId": "6051",
    "Id": "12312111" // and so on
} 

但是当我启动这个测试时,我得到一个错误(标题名称)。我该如何解决这个问题?

【问题讨论】:

    标签: c#


    【解决方案1】:

    修改代码为

    public static string ReadSetting(string name)
    {
        var parts = name.Split('.', StringSplitOptions.RemoveEmptyEntries);
    
        JObject jObj= GetObject();
        foreach (var part in parts)
        {
            var token = jObj[part];
            if (token == null)
            {
                return null;
            }
            else
            {
               return token.ToString();
            }
        }
        
        return null;
    }
    

    其实还有一个逻辑需要注意var parts = name.Split('.', StringSplitOptions.RemoveEmptyEntries);可能意味着支持多个设置结果。但 ReadSetting 函数中的逻辑不是。它只返回第一个匹配的设置。

    【讨论】:

    • 谢谢回答!但是这个方法应该返回什么?现在它给出了“并非所有代码路径都返回值”的错误。我想在最后一个大括号之前应该还有一个“返回”
    • @maitre 我已经更新了。你可以再试一次。
    • 用你的代码替换我的代码后,我遇到了 2 个问题:我的 AuthKey 和 AuthValue 在这个测试中得到 SystemFormatException,在所有其他测试中得到 System.Uri.FormatException =(
    • 您可以检查 BaseClass.mainURL、AuthKey 和 AuthValue,我认为它们不是有效值。
    • 这些变量适用于所有其他测试,但它们不仅适用于本次测试
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多