Faker API для .NET — генерация случайных имен и других данных

от автора

Помню, недавно выполнял задание на вакансию масленка после технического собеседования.

Формулировка следующая:

- Необходимо сгенерировать список случайных объектов по предоставленным моделям, сериализовать их в json, после загрузить их из файла в обратно память.

В общем, простое задание на джуна, хоть не аналог авито писать, и на том спасибо.

Оригинальная формулировка задания:

Create a program which will execute the next steps: 1) Create collection of randomly generated objects in memory by provided models, number of ofjects 10000; 2) Serialyze it to JSON format; 3) Write the serialization result to the current user desktop directory, the text file name should be "Persons.json"; 4) Clear the in memory collection; 5) Read objects from file; 6) Display in console persons count, persons credit card count, the average value of child age.  Use POSIX format for dates. Use lowerCamelCase JSON notation in result file.
// Data models class Person { public Int32 Id { get; set; } public Guid TransportId { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public Int32 SequenceId { get; set; } public String[] CreditCardNumbers { get; set; } public Int32 Age { get; set; } public String[] Phones { get; set; } public Int64 BirthDate { get; set; } public Double Salary { get; set; } public Boolean IsMarred { get; set; } public Gender Gender { get; set; } public Child[] Children { get; set; } } class Child { public Int32 Id { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public Int64 BirthDate { get; set; } public Gender Gender { get; set; } } enum Gender { Male, Female }

Я если честно не понимаю, почему нельзя просто использовать псевдонимы системных типов, подскажите в комментариях.

Подключаем Faker

Faker можно добавить в проект через менеджер пакетов NuGet.

У данного пространства есть целая куча классов, с помощью которым можно генерировать те или иные данные:

Faker.Addressгенерация адресов

Faker.Booleanгенерация логических данных

Faker.Companyгенерация компаний

Faker.Identificationгенерация идентификационных данных

Faker.Financeгенерация финансовых значений

Faker.Nameгенерация имен

Подключаем нужное пространство имен и начинаем пользоваться:

using Faker; using Collection.Data;  namespace Collection.Generator {     internal class PersonsGenerator     {         public List<Person> persons = new List<Person>();         Random random = new Random();           DateTimeGeneration birthdayDate = new DateTimeGeneration();         PhonesGenerator phones = new PhonesGenerator();         ChildGenerator children = new ChildGenerator();         CreditCardsGeneration creditCards = new CreditCardsGeneration();          public PersonsGenerator(int count)         {             for (int i = 0; i < count; ++i)             {                 persons.Add(new Person                 {                     Id = i,                     TransportId = Guid.NewGuid(),                                          // Случайная генерация имен                     FirstName = Faker.Name.First(),                     LastName = Faker.Name.Last(),                                          SequenceId = i,                     CreditCardNumbers = creditCards.CreateCreditCards(),                                          // Числа тоже можно генерировать                     Age = Faker.RandomNumber.Next(18, 100),                                          Phones = phones.CreatePhones(),                     BirthDate = ((DateTimeOffset)birthdayDate.CreateBirthdayDate()).ToUnixTimeSeconds(),                     Salary = (double)Faker.RandomNumber.Next(10000, 100000),                     IsMarred = Faker.Boolean.Random(),                                          // Можно рандомизировать константы из перечислений                     Gender = Faker.Enum.Random<Gender>(),                                          Children = children.CreateChildren(out childrenCount)                 });             }                   }     } }

Теперь можно попробовать вывести все это в консоль, я написал небольшой класс с рефлексией, который выводит данные в консоль:

    internal class ConsoleWriter<T> where T: class     {         public ConsoleWriter(List<T> collection)         {             Type type = typeof(T);             PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);              foreach (var o in collection)             {                 for (int i = 0; i < properties.Length; i++)                 {                     Console.WriteLine($"{properties[i].Name}:\t{properties[i].GetValue(o)}");                                          // Не обращаем внимание, так, для себя сделал                     if (properties[i].PropertyType.IsArray)                     {                         Console.WriteLine("Array!");                     }                                          }                 Console.WriteLine();             }                      }     }
static void Main(string[] args) {  // Здесь генерация объектов PersonsGenerator generator = new PersonsGenerator(5);   JsonWriter<Person> jsonWriter = new JsonWriter<Person>();   JsonReader<Person> jsonReader = new JsonReader<Person>();    // Вот здесь вывод данных в консоль после генерации   ConsoleWriter<Person> debuger = new ConsoleWriter<Person>(generator.persons);   Console.WriteLine("Reflection is end. Push ENTER to continue...");    // Запись данных в JSON   jsonWriter.WriteToFile(generator.persons);   Console.WriteLine("Serialization is complete!");     // Очистка после подтверждения   Console.ReadLine();   generator.persons.Clear();   generator.Dispose();    // Чтение из файла   var persons = jsonReader.ReadFromFile();    // Вывод данных   ValueCounter counter = new ValueCounter();      Console.WriteLine($"Persons count is {persons.Count}");   Console.WriteLine($"Average children age is {counter.AverageChildAge(persons)}");   Console.WriteLine($"Credit cards count is {counter.CreditCardCount(persons)}");    Console.ReadKey(); }

Результат в консоли следующий:

Имена конечно иногда странные, но, как мне кажется для тестов вполне сойдет.

Итоги

В конечном итоге, меня не взяли на работу масленком, дав следующий ответ:

HR: Даниил, здравствуйте!
Мы благодарим Вас за проявленный интерес к нашей компании и желание с нами сотрудничать.
На позицию, которую мы Вас рассматривали, мы пока не готовы Вам сделать предложение о работе. С Вашего позволения мы хотели бы Ваше резюме добавить в кадровый резерв, чтобы в случае, если у нас появится подходящая вакансия, связаться с Вами.
Также мы желаем Вам успехов в поисках работы!

Я: Опишите пожалуйста более точно причину отказа.

HR: Уточнила, тимлид обещал ответить сегодня вечером или завтра до обеда

—«Через 3 часа»—

HR: Даниил, по поводу обратной связи: самое основное — недостаточно теоретических знаний и отсутствие опыта работы с asp net.

Как мне сказали люди, скорее всего они нашли кандидата лучше, но ничего страшного, может в другой раз повезет. Зато я познакомился с новым интересным инструментом, надеюсь, что в дальнейшем.

Было бы интересно почитать ваши советы и отзывы по поводу статьи, так как пишу первый раз что-то подобное. Спасибо!


ссылка на оригинал статьи https://habr.com/ru/post/673674/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *