Евгений Колесников 4 vuotta sitten
vanhempi
sitoutus
5d3cd046ff
4 muutettua tiedostoa jossa 83 lisäystä ja 16 poistoa
  1. 17 1
      articles/5_3_1_10_unit_test.md
  2. 45 15
      articles/cs_http.md
  3. 19 0
      articles/fake_unit_test.md
  4. 2 0
      readme.md

+ 17 - 1
articles/5_3_1_10_unit_test.md

@@ -1,3 +1,11 @@
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/null.md">
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/fake_unit_test.md">Fake data. Тестирование методов получающих внешние данные из удалённых источников.
+</a></td><tr></table>
+
 # Создание UNIT-тестов
 
 ## Немного теории
@@ -303,4 +311,12 @@ static public void Done()
     }
     ```
 
-    Тут используется атрибут **ExpectedException**. Он означает, что НОРМАЛЬНЫМ завершением этого теста будет исключение указанного типа.
+    Тут используется атрибут **ExpectedException**. Он означает, что НОРМАЛЬНЫМ завершением этого теста будет исключение указанного типа.
+
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/null.md">
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/fake_unit_test.md">Fake data. Тестирование методов получающих внешние данные из удалённых источников.
+</a></td><tr></table>

+ 45 - 15
articles/cs_http.md

@@ -260,25 +260,55 @@ Authorization: Basic esmirnov 111103
     client.DeleteAsync($"http://localhost:8080/Product?id={id}").Result;
     ```
 
-<!-- ## POST запросы с JSON
+## POST запросы с JSON (Добавление записей в модель в терминологии REST API)
 
-Возможно понадобится что-то послать в АПИ, разберём как это делается:
+1. В проекте C# нарисуйте форму добавления продажи (в окне продукции)
 
-```cs
-// сначала запихиваем объект в JSON-строку. 
+2. В **DataProvider** добавьте метод *AddProductSale*, который на входе получает экземпляр класса **ProductSale** и реализуйте отправку POST-запроса в локальный PHP-сервер, который добавит эту продажу в соответствующую таблицу
 
-// тут можно завести отдельный класс, а можно создать анонимный объект
-var obj = new {username="qq", password="ww"};
+    ```cs
+    // сначала запихиваем объект в JSON-строку. 
+    var jsonString = serializer.Serialize(NewProductSale);
 
-// и тем же сериализатором превращаем в JSON-строку
-var jsonString = serializer.Serialize(obj);
+    // создаём контент для запроса
+    var json = new StringContent(jsonString, Encoding.UTF8, "application/json");
 
-// создаём контент для запроса
-var json = new StringContent(jsonString, Encoding.UTF8, "application/json");
+    // и вызываем POST-запрос
+    var client = new HttpClient();
+    // не забываем добавить авторизацию
+    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basic);
+    var result = client.PostAsync("http://localhost:8080/ProductSale", json).Result;
 
-// и вызываем POST-запрос
-var client = new HttpClient();
-var result = client.PostAsync("http://localhost:8080/echo", json).Result;
+    // Console.WriteLine(result.Content.ReadAsStringAsync().Result);
+    ```
+
+3. Обработка POST-запроса с типом *application/json*
+
+    В PHP есть глобальная переменная **$_POST** в которую автоматически парсятся данные POST запроса, но только если тип запроса *application/x-www-form-urlencoded*.
+
+    Тип JSON появился сравнительно недавно, поэтому PHP автоматически его не парсит. Приходится писать разбор вручную
+
+    ```php
+    private function processPost($path)
+    {
+        // входной поток данных (содержимое запроса, content) считывается в строку
+        $rawData = file_get_contents('php://input');
+        // и преобразуется в объект 
+        $json = json_decode($rawData);
+        switch($path)
+        {
+            case '/ProductSale':
+                $this->auth();
+
+                // тут пишем запрос вставки данных в таблицу 
+                // к полям объекта JSON можно обращаться так: $json->Title, ...
+
+                $this->response['status'] = 0;
 
-Console.WriteLine(result.Content.ReadAsStringAsync().Result);
-``` -->
+                break;
+
+            default:
+                header("HTTP/1.1 404 Not Found");
+        }
+    }
+    ```

+ 19 - 0
articles/fake_unit_test.md

@@ -0,0 +1,19 @@
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/5_3_1_10_unit_test.md">Создание UNIT-тестов
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/fake_unit_test.md">Fake data. Тестирование методов получающих внешние данные из удалённых источников.
+</a></td><tr></table>
+
+# Fake data. Тестирование методов получающих внешние данные из удалённых источников.
+
+На прошлой лекции мы тестировали простые локальные методы, которые далают какие-то вычислительные задачи. Но нам нужно тестировать наше приложение, которое общается с внешним миром - получает данные от SQL-сервера или через АПИ. 
+
+В экосистеме Microsoft есть возможность создавать поддельное (fake) окружение, но эта фича доступна только в Enterprise версии и нам недоступна. Поэтому окружение мы будем симулировать данными поддельного провайдера данных.
+
+1. В наше решение ("список продукции") добавим проект UNIT-тестов и добавим в него ссылку на основной проект
+
+2. В проекте UNIT-теста создадим класс FakeDataProvider, реализующий наш IDataProvider, в котором реализуем методы возвращая поддельные данные.
+
+3. После реализации **FakeDateProvider** напишите тесты для добавления и удаления продукции (соответственно всю логику проверки валидности данных нужно перенести в методы **FakeDateProvider**). При инициализации тестов Globals.DataProvider присваиваем наш FakeDateProvider.

+ 2 - 0
readme.md

@@ -429,6 +429,8 @@ ERD,
 
 10. [Создание UNIT-тестов](./articles/5_3_1_10_unit_test.md)
 
+11. [Fake data. Тестирование методов получающих внешние данные из удалённых источников](./articles/fake_unit_test.md)
+
 ### Лабораторнo-практические работы
 1. [Создание проекта по индивидуальному заданию. Разработка Unit-тестов для проекта](./articles/5_3_1_10_unit_test_lab.md)
 1. Лабораторная работа «Разработка тестового сценария проекта»