Parse JSON to obj to string

0

Cześć, mam problem z konwersją JSONa do stringa.

JSON ma następującą strukturę:

{
  "UserConfig": {
    "UserName": "user",
    "Password": "password",
    "WebsiteURL": "https://www.google.com/"
  }
}

Zrobiłem już klasę User:

public class UserConfig
    {

        [JsonProperty("UserName")]
        public string UserName { get; set; }

        [JsonProperty("Password")]
        public string Password { get; set; }

        [JsonProperty("WebsiteURL")]
        public string WebsiteURL { get; set; }
    }

    public class User
    {
        [JsonProperty("UserConfig")]
        public UserConfig UserConfig { get; set; }
    }

Teraz mam kolejną klasę która ma pobrać tego JSONa do var'a na podstawie podanego Patha do configa (domyślnie, będzie kilka UserConfigów używanych w projekcie - testy automatyczne)

    public class UserConfigReader
    {
        public static void JsonLoad(string UserConfigPath)
        {

            using (StreamReader r = new StreamReader(UserConfigPath))
            {
                string result = string.Empty;
                var json = r.ReadToEnd();
                var configObj = JsonConvert.DeserializeObject<User>(json);
            }
        }
    }

I teraz chciałbym configObj pobrać w kolejnej klasie testu jednostkowego, który by sprawdzał na podstawie

UserConfigPath

czy dane zostały prawidłowo wczytane do zmiennych typu string

string UserName
string Password
string WebsideURL
2

Odnosząc się do komentarzy. Testowanie, czy Json się skonwertował, czy nie - nie ma sensu. Bo to jest testowanie JSONa.

Natomiast żeby upewnić się, że wszystko poszło ok, ja bym zrobił to tak:

Musisz mieć metodę, która zaczytuje config, coś w stylu:

public UserConfig ReadUserConfig(string jsonString)
{
//tutaj sobie konwertujesz i zwracasz UserConfig
}

Następnie testujesz to np. tak (pseudokod):

public void ReadUserConfig_GetsJsonString_ReturnsUserConfig()
{
  string json = "poprawny string jsona";
  
  UserConfig result = reader.ReadUserConfig(json);
  Assert.IsNotNull(result);
  Assert.IsNotNull(result.UserName);
  Assert.IsTrue(result.UserName != string.Empty);
//itd.
}

W innym teście możesz mockować ReadUserConfig i sprawdzać, czy został wywołany wtedy, kiedy trzeba.

2
    public class UserConfigReader
    {
        public static void JsonLoad(string UserConfigPath)
        {

            using (StreamReader r = new StreamReader(UserConfigPath))
            {
                string result = string.Empty;
                var json = r.ReadToEnd();
                var configObj = JsonConvert.DeserializeObject<User>(json);
            }
        }
    }

I teraz chciałbym configObj pobrać w kolejnej klasie testu jednostkowego, który by sprawdzał na podstawie

UserConfigPath

czy dane zostały prawidłowo wczytane do zmiennych typu string

string UserName
string Password
string WebsideURL

Nie wiem czy dobrze zrozumiałem problem, ale może zmień metodę JsonLoad żeby zwracała typ configObj a nie void? I wywowałaj metodę tej klasy w tej klasie gdzie chcesz zbadać co jest w stringach.

Nie wiem co konkretnie chcesz osiągnąć, ale do testowania Jsonów w środowisku C# służy popularna biblioteka: https://www.newtonsoft.com/json/help/html/JsonSchema.htm

Możesz wtedy sprawdzić, czy np w JSONie nie znajdą się pola, które są niepożądane, użyć regular expression aby sprawdzić czy ze stringami jest wszystko w porządku itd itp. Jeżeli nie przejdzie walidacji to testu też nie.

Czego od Ciebie oczekują konkretnie w firmie?

0

Musiałem kilka rzeczy zmienić i w sumie wygląda to tak:

public class UserConfig
    {
        
        public string UserName { get; set; }

        
        public string Password { get; set; }

        
        public string WebsiteURL { get; set; }


        public UserConfig()
        {

        }
}
        public UserConfig LoadJsonConfigToObj(string UserConfigPath)
        {
            UserConfig userConfig = new UserConfig();
            


            using (StreamReader file = File.OpenText(UserConfigPath))
            {
                var json = file.ReadToEnd();
                var configObj = JsonConvert.DeserializeObject<UserConfig>(json);
                return configObj;
            }
        }

no i sam test jednostkowy:

        public string UserConfigPath = @"C:\    "

        [TestMethod]
        public void UserSettingChecker()
        {
            //Arrange
            
            var UserConfigReader = new UserConfigReader();
            string UserNameExpected = "user";
            string PasswordExpected = "password";
            string WebsideURLExpected = "https://www.google.com/";

           


            //Act
            var a = UserConfigReader.LoadJsonConfigToObj(UserConfigPath);

            //Assert
            Assert.AreEqual(UserNameExpected, a.UserName);
            Assert.AreEqual(PasswordExpected, a.Password);
            Assert.AreEqual(WebsideURLExpected, a.WebsiteURL);
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1