Parse JSON to obj to string

Odpowiedz Nowy wątek
2019-01-25 10:16
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
Pokaż pozostałe 2 komentarze
Wychodzi, że chcesz testować Jsona? Nie rób tego. - Juhas 2019-01-25 11:13
Nie chcę testować JSONa, a chcę testować convertowanie JSONa do zmiennych - Glugsti 2019-01-25 11:14
To ma sens? - Glugsti 2019-01-25 11:14
No nie ma, bo to właśnie jest testowanie Jsona :) I przy okazji, nie musisz robić adnotacji do pól, które nazywają się tak samo jak pola w Jsonie. - Juhas 2019-01-25 11:23
To ja mogę sprawdzić czy dany config się wgrał za każdym razem jak ruszę coś w projekcie? Tym bardziej, że będę też wgrywał configi dotyczące scenariuszy w testach automatycznych, które potem chcę wgrywać iloczyn kartezjańskich (każdy z każdym) - Glugsti 2019-01-25 11:28

Pozostało 580 znaków

2019-01-25 11:35
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.

edytowany 2x, ostatnio: Juhas, 2019-01-25 12:25
Tylko po co ten try-catch? - somekind 2019-01-25 12:21
Jeśli Json czegoś nie będzie mógł skonwertować, to się wywali... Ale racja, tu mamy zapewnionego jsona. Try-catch jest niepotrzebny. - Juhas 2019-01-25 12:24
Jak JSON będzie niepoprawny, to test też się wywali. - somekind 2019-01-25 12:39
Ale tu mamy zapewnionego poprawnego jsona. - Juhas 2019-01-25 12:39

Pozostało 580 znaków

2019-01-25 12:09
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?


EH PANOWIE CORAZ WIĘCEJ AMATORÓW SIĘ PCHA DO ZABAWY HEHE MAM NADZIEJĘ, ŻE PRZEJDZIE TA NOWELIZACJA USTAWY I PO BUŁKI BĘDZIE MOŻNA CHODZIĆ TYLKO Z LICENCJĄ BO SERIO NIEKTÓRZY NIE MAJĄ ANI DOŚWIADCZENIA ANI WYOBRAŹNI I NA PRZYKŁAD UPUSZCZĄ BUŁKĘ NA PODŁOGĘ

hehe pamiętacie obwarzan75 rogalking jak byliśmy w ’99 na zlocie pieczywa tostowego w Siedlcach? XD Co tam się działo to głowa mała!!! Całe życie z wariatami XDDD KTO MA WIEDZIEĆ TEN WIE XD
edytowany 1x, ostatnio: BluzaWczolg, 2019-01-25 12:09
Ma być to szkielet do testu automatycznego - będą wczytywane dane do usera (w aplikacji jest kilka roli) oraz dane do scenariusza (też będzie kilka różnych przypadków - szczególnie z obsługą specjalnych znaków w aplikacji), które będą wykorzystywane w teście. Na ten moment chcę tylko sprawdzić czy dany config będzie za każdy razem dobrze podpinany i przypisywany do zmiennych typu string. - Glugsti 2019-01-25 12:39

Pozostało 580 znaków

2019-01-25 14:44
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);
        }
edytowany 1x, ostatnio: Glugsti, 2019-01-25 14:45
Jakby ktoś miał uwagi to proszę śmiało pisać, z chęcią się douczę! - Glugsti 2019-01-25 14:45

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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