Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Hasonló dokumentumok
Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

Térinformatikai és távérzékelési alkalmazások fejlesztése. Szoftverek minőségbiztosítása. Szoftverek minőségbiztosítása Verifikáció és validáció

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

Térinformatikai és távérzékelési alkalmazások fejlesztése. Szoftverek minőségbiztosítása

Webes alkalmazások fejlesztése 10. előadás. Szolgáltatás alapú rendszerek megvalósítása (ASP.NET WebAPI) Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

Webszolgáltatások (WS)

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Webes alkalmazások fejlesztése 9. előadás. Webszolgáltatások felhasználása (ASP.NET Core &.NET Framework)

Bevezető. Servlet alapgondolatok

API tervezése mobil környezetbe. gyakorlat

Models are not right or wrong; they are more or less useful.

WEB-PROGRAMOZÁS II. 1. Egészítse ki a következő PHP kódot a következők szerint: a,b,c,d: <?php. interface Kiir { public function kiir();

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Cserép Máté.

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Models are not right or wrong; they are more or less useful.

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

COMET webalkalmazás fejlesztés. Tóth Ádám Jasmin Media Group

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Webes alkalmazások fejlesztése 6. előadás. Weblapok fejlesztése és architektúrája (ASP.NET)

Grafikus keretrendszer komponensalapú webalkalmazások fejlesztéséhez

Szoftvertechnológia alapjai Java előadások

Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 9. előadás. Webszolgáltatások felhasználása (ASP.NET WebAPI)

QBE Édes Otthon lakásbiztosítás tarifáló webservice. Fejlesztői dokumentáció 1.0.2

Élő webes alkalmazások rendszerfelügyelete cím- és tartalomteszteléssel

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Állapotfenntartás. Állapotfenntartás. Állapotfenntartás.

Webes alkalmazások fejlesztése

Web programoz as

Google Web Toolkit. Elek Márton. Drótposta kft.

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése Giachetta Roberto

C#, OOP. Osztályok tervezése C#-ban

Web-fejlesztés NGM_IN002_1

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET)

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

RIA Rich Internet Application

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

MVC. Model View Controller

JAVA webes alkalmazások

SOAP komponensek Delphiben

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté.

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté

Programozási nyelvek Java

Fejlesztés, működtetés, felügyelet Hatékony infrastruktúra IBM szoftverekkel

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

Simon Balázs Dr. Goldschmidt Balázs Dr. Kondorosi Károly. BME, Irányítástechnika és Informatika Tanszék

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk. Cserép Máté

Generikus Típusok, Kollekciók

Segédanyag: Java alkalmazások gyakorlat

Földmérési és Távérzékelési Intézet

Objektumelvű programozás

Mobil Informatikai Rendszerek

KROMESCH SÁNDOR APP FELHŐ. API-k és Webszolgáltatások a Cloudban. Magyarországi Web Konferencia November 8.

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

WWW Kliens-szerver Alapfogalmak Technológiák Terv. Web programozás 1 / 31

XML Webszolgáltatás alapú osztott alkalmazás fejlesztése Johanyák Zsolt Csaba 1

Osztott Objektumarchitektúrák

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET Core) Cserép Máté

SOA modell: Ez az interfész definiálja az elérhető adatokat, és megadja, hogy hogyan lehet azokhoz hozzáférni.

Webes alkalmazások fejlesztése. 9. előadás Bevezetés az ASP.NET MVC keretrendszerbe

Testreszabott alkalmazások fejlesztése Notes és Quickr környezetben

Bevezetés, a C++ osztályok. Pere László

Komponensek együttműködése web-alkalmazás környezetben. Jónás Richárd Debreceni Egyetem T-Soft Mérnökiroda KFT

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

Webes alkalmazások fejlesztése 14. fejezet. Szolgáltatások adatkezelése (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Szolgáltatásorientált rendszerintegráció. SOA-alapú rendszerintegráció. Web-szolgáltatások: SOAP, WSDL

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

Bevezetés Működési elv AJAX keretrendszerek AJAX

Számítógépes Hálózatok Felhasználói réteg DNS, , http, P2P

Felhasználói réteg. Számítógépes Hálózatok Domain Name System (DNS) DNS. Domain Name System

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

A legalacsonyabb szintű tesztelés. A programot felépítő egységek tesztelése Unit: egy rendszer legkisebb önálló egységként tesztlehető része.

A Java EE 5 plattform

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Java és web programozás

ROS Remote Operations Service

Adatbázisok webalkalmazásokban

Adatbányászat és Perszonalizáció architektúra

Többrétegű műszaki nyilvántartás. NETinv

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Szolgáltatás Orientált Architektúra és több felhasználós adatbázis használata OKF keretein belül. Beke Dániel

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Webes alkalmazások fejlesztése 8. előadás Webszolgáltatások megvalósítása (ASP.NET WebAPI) 2016 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

A webszolgáltatás A webszolgáltatás (web service) olyan protokollok és szabályok gyűjteménye, amely lehetővé teszi alkalmazások közötti platform független adatcserét hálózaton keresztül azaz a rendszernek egy, vagy szolgáltatója (service provider) biztosítja a funkcióknak olyan felületét, amelyet a fogyasztók (service consumer) elérhetnek a fogyasztó lehet bármilyen alkalmazás, weblap, a kommunikációra számos protokollt és megoldást használhat, pl. SOAP (Simple Object Access Protocol) és WSDL (Web Services Description Language), vagy REST lehetővé teszi a szolgáltatásorientált architektúra (Service Oriented Architecture, SOA) létrehozását ELTE IK, Webes alkalmazások fejlesztése 8:2

REST A REST (Representational State Transfer) egy szoftver architektúra típus, amely lehetővé teszi skálázható, nagy teljesítményű elosztott hálózati alkalmazások fejlesztésére elsősorban HTTP alapon kommunikál alapvető HTTP utasítások (GET, POST, PUT, DELETE, ) segítségével megszorításokat ad a rendszernek: kliens-szerver modell, egységes interfész, állapotmentes kommunikáció, kiegészíthetőség (code on demand), a támogató szoftverek a RESTful alkalmazások ELTE IK, Webes alkalmazások fejlesztése 8:3

ASP.NET WebAPI Az ASP.NET WebAPI egy RESTful alkalmazások fejlesztését lehetővé tevő keretrendszer az MVC architektúrát valósítja meg, a tevékenységeket vezérlők felügyelik, amelyek adott erőforrásra és utasításra reagálnak az adatokat alapértelmezetten JSON (Javascript Object Notation) formátumban továbbítja, de a kliens kérésének megfelelően automatikusan tudja a formátumot módosítani könnyen integrálható az ASP.NET MVC webalkalmazásokkal NuGet-ből telepíthető (ASP.NET WebAPI csomag) ELTE IK, Webes alkalmazások fejlesztése 8:4

JSON A JSON egy egyszerű formátum objektumok szöveges leképezése, pl.: { // objektum "id": 1234, // attribútum "group": "tool", "name": "hammer", "resposible": { "name" : "John", // összetett attribútum "materials": [ // tömb attribútum { "name": "steel", ] ELTE IK, Webes alkalmazások fejlesztése 8:5

Vezérlők A vezérlőkben (ApiController) valósítjuk meg a HTTP akcióműveleteket (Get, Post, ) a visszatérési érték a HTTP válasz törzsébe (body) kerül, ekkor egy OK (200) válasz készül amennyiben nincs visszatérési érték (void), akkor egy No Content (204) válasz kerül kiküldésre a műveletek feloldása az elérési útvonal leképezésének (HttpRoute) megfelelően történik, alapértelmezetten a <domain>/api/<vezérlő>/<paraméterek> formában a műveletek csak korlátozottan túlterhelhetőek az erőforrás címe mellett tartalmat is szolgáltathatunk, amit a kérés törzsébe helyezünk (FromBody) ELTE IK, Webes alkalmazások fejlesztése 8:6

Vezérlők Pl.: public class ProductsController : ApiController { IList<string> products; // modell // elérés GET /api/products/ public IEnumerable<string> Get() { return products; // összes termék lekérése // elérés: GET /api/products/1 public string Get(int id) { return products[id]; // adott termék lekérése ELTE IK, Webes alkalmazások fejlesztése 8:7

Vezérlők Pl.: // elérés: POST /api/products/ public void Post([FromBody] string product) { // meg kell adnunk, hogy a tartalom a // törzsben található products.add(product); // elérés: DELETE /api/products/1 public void Delete(int id) { products.removeat(id); ELTE IK, Webes alkalmazások fejlesztése 8:8

Konfiguráció A WebAPI használatba vétele előtt az ASP.NET alkalmazást megfelelő konfigurációval (elsősorban az útvonal feloldás leírásával) kell ellátnunk az útvonalelérés konfigurációját a WebApiConfig osztály Register művelete végzi (az App_Start könyvtárban) : config.routes.maphttproute( name: "DefaultApi", routetemplate: "api/{controller/{id", ); az Application_Start eseménykezelőben ezt a műveletet át kell adnunk a globális konfigurációnak: GlobalConfiguration.Configure( WebApiConfig.Register); ELTE IK, Webes alkalmazások fejlesztése 8:9

Adatszolgáltatás A webszolgáltatás műveletei nem csak primitív típusokat, de összetett, adatátviteli objektumokat (Data Transfer Object, DTO) is közölhetnek DTO bármilyen objektum lehet, ami szérializálható (az elvárt formátumban), azaz leképezhető primitív értékekből álló felépítésre a felépítését úgy kell megválasztanunk, hogy az belső adatokat, illetve szükségtelen, vagy körkörös hivatkozásokat (pl. entitásobjektum esetén) ne tartalmazzon visszaadhatunk egyedileg konfigurált HTTP üzenetet is (HttpResponseMessage), amelyet aszinkron módon is létrehozhatunk (IHttpActionResult) ELTE IK, Webes alkalmazások fejlesztése 8:10

Adatszolgáltatás Pl.: public class Product { // DTO típus public Int32 Id { get; set; public String Name { get; set; public class ProductsController : ApiController { // elérés GET /api/products/ public IEnumerable<Product> Get() { return products; // összes termék lekérése ELTE IK, Webes alkalmazások fejlesztése 8:11

Adatszolgáltatás Pl.: public class ProductsController : ApiController { // elérés GET /api/products/ public HttpResponseMessage Get() { return new HttpResponseMessage() { // egyedileg összeállított üzenet StatusCode = HttpStatusCode.OK, Content = new ObjectContent<Product>( products, Configuration.Formatters.JsonFormatter) // megadjuk a kódot és a tartalmat ; ELTE IK, Webes alkalmazások fejlesztése 8:12

Műveletek elérése A HTTP műveletek társítása megfeleltetése vezérlő műveleteknek lehet automatikus, a név kezdőszelete alapján történik, pl.: public class ProductsController : ApiController { // elérés: GET /api/products/1 public Product GetSingleProduct(int id) { // elérés: DELETE /api/products/1 public void DeleteProduct(int id) { ELTE IK, Webes alkalmazások fejlesztése 8:13

Műveletek elérése manuális, attribútumok segítségével megjelölve a HTTP műveletet (HttpGet, HttpPost, HttpDelete, ) és az elérési útvonalat (Route), pl.: public class ProductsController : ApiController { // elérés: GET /api/myproducts/1 [Route("api/myproducts/{id")] [HttpGet] public Product FindProduct(int id) { a manuális útvonal feloldást külön kell jeleznünk: config.maphttpattributeroutes(); ELTE IK, Webes alkalmazások fejlesztése 8:14

Műveletek elérése az útvonal megjelölésénél lehetőségünk van előtagot adni a vezérlőnek (RoutePrefix) tetszőleges módon elhatárolni a paramétereket (további útvonal komponensek hozzáadásával) megszorításokat adni a paraméterekre, úgymint típus (bool, datetime, decimal, double, float, guid, int, long), hosszúság (length, maxlength, maxlength), érték (min, max, range, values), alak (alpha, regex) meghatározni a prioritást (RouteOrder), amennyiben több műveletre is illeszkedik az útvonal a típusmegjelölés lehetővé teszi a túlterhelést, mivel a típusnak megfelelő műveletet tudja futtatni a rendszer ELTE IK, Webes alkalmazások fejlesztése 8:15

Műveletek elérése pl.: [RoutePrefix("api/myproducts")] // előtag public class ProductsController : { // elérés: GET /api/myproducts/1 [Route("{id:int:min(1)")] public Product GetProduct(int id) { // elérés: GET /api/myproducts/tools/item/1 [Route("{group:values(tools machines)/ item/{id:int:min(1)")] public Product GetProduct(string group, int id) { ELTE IK, Webes alkalmazások fejlesztése 8:16

Példa Feladat: Valósítsuk meg egy utazási ügynökség weblapját, amelyben apartmanok között böngészhetünk. könnyítsük meg a foglalást az által, hogy a dátumot egy naptár (gldatepicker) segítségével lehessen kiválasztani a dátumkiválasztó automatikusan lekérdezi (jquery segítségével) a szolgáltatástól, mely napok szabadok a szolgáltatása vezérlője (RentDateApiController) egy műveletet biztosít (Get) a megfelelő napok lekérdezésére magát a lekérdezést a modell (TravelService) biztosítja (GetRentDates), amely adott egy hónap körüli ELTE IK, Webes alkalmazások fejlesztése 8:17

Példa Tervezés: ApiController Controllers::RentDateApiController - _service :ITravelService + Get(Int32?, Int32?, Int32?) :IEnumerable<DateTime> + RentDateApiController() Models::TravelService - _entities :TravelAgencyEntities + GetApartment(Int32?) :Apartment + GetBuilding(Int32?) :Building + GetBuildingImage(Int32?, Boolean) :Byte[] + GetBuildingImageIds(Int32?) :IEnumerable<Int32> + GetBuildingMainImage(Int32?) :Byte[] + GetBuildings(Int32?) :IEnumerable<Building> + GetBuildingWithApartments(Int32?) :Building + GetPrice(Int32?, RentViewModel) :Int32 + GetRentDates(Int32, Int32, Int32) :IEnumerable<DateTime> + NewRent(Int32?) :RentViewModel + SaveRent(Int32?, String, RentViewModel) :Boolean + TravelService() «property» + Buildings() :IEnumerable<Building> + Cities() :IEnumerable<City> ELTE IK, Webes alkalmazások fejlesztése 8:18

Példa Megvalósítás (RentDateApiController.cs): [RoutePrefix("api/rentdate")] // útvonal feloldás megadása public class RentDateApiController : ApiController { [Route("{apartmentId/{year/{month")] // útvonal feloldás megadása public IEnumerable<DateTime> Get( Int32? apartmentid, Int32? year, Int32? month) { ELTE IK, Webes alkalmazások fejlesztése 8:19

Példa Megvalósítás (Rent/Index.cshtml): <script type="text/javascript"> $(window).load(function () { jquery.getjson("api/rentdate/" + @Model.Apartment.Id + "/" + year + "/" + month, function (data) { options.selectabledates = parsedates(data); ); ELTE IK, Webes alkalmazások fejlesztése 8:20

Visszajelzés és hibakezelés A vezérlő nem csupán az alapértelmezett, de tetszőleges HTTP kóddal tud válaszolni a kérésekre, amennyiben általános visszatérési típust specifikálunk (IHttpActionResult) előre definiált visszatérési függvényekkel könnyedén megadhatjuk az eredményt: Ok(<content>), Created(<location>, <content>), Redirect(<location>), NotFound(), Unauthorized(), BadRequest(<message>), Conflict(), InternalServerError(<exception>)) a megfelelő visszajelzés a hibakezelés szempontjából is fontos (amennyiben nem kezeljük le a műveletben dobott kivételeket, INTERNAL SERVER ERROR (500) üzenetet küld a szolgáltatás) ELTE IK, Webes alkalmazások fejlesztése 8:21

Visszajelzés és hibakezelés pl.: public IHttpActionResult GetProduct(int id) { try { return Ok(product); // amennyiben sikeres volt a // lekérdezés, 200-as kód catch { return NotFound(); // ellenkező esetben 404-es kód ELTE IK, Webes alkalmazások fejlesztése 8:22

Tesztelés A webszolgáltatások tesztelése elvégezhető manuálisan, kliens oldalon, a kérések küldését biztosító program (böngésző) segítségével automatikusan, kliens oldalon, a kérések küldését biztosító osztály (pl. HttpClient) segítségével automatikusan, szerver oldalon, a vezérlő műveleteinek közvetlen tesztelésével A webszolgáltatás használata a célkörnyezetben (weblap, asztali alkalmazás, ) már integrációs teszt, amelyet csak a megfelelő egységtesztek végrehajtása után kezdeményezhetünk ELTE IK, Webes alkalmazások fejlesztése 8:23

Mock objektumok Amennyiben függőséggel rendelkező programegységet tesztelünk, a függőséget helyettesítjük annak szimulációjával, amit mock objektumnak nevezünk megvalósítja a függőség interfészét, egyszerű, hibamentes funkcionalitással használatukkal a teszt valóban a megadott programegység funkcionalitását ellenőrzi, nem befolyásolja a függőségben felmerülő esetleges hiba Mock objektumokat manuálisan is létrehozhatunk, vagy használhatunk erre alkalmas programcsomagot pl. NSubstitute, Moq letölthetőek NuGet segítségével ELTE IK, Webes alkalmazások fejlesztése 8:24

Mock objektumok Pl. : class DependencyMock : IDependency // mock objektum { // egy egyszerű viselkedést adunk meg public Double Compute() { return 1; public Boolean Check(Double value) { return value >= 1 && value <= 10; Dependant d = new Dependant(new DependencyMock()); // a mock objektumot fecskendezzük be a függő // osztálynak ELTE IK, Webes alkalmazások fejlesztése 8:25

Mock objektumok Moq segítségével könnyen tudunk interfészekből mock objektumokat előállítani a Mock generikus osztály segítségével példányosíthatjuk a szimulációt, amely az Object tulajdonsággal érhető el, és alapértelmezett viselkedést produkál, pl.: Mock<IDependancy> mock = new Mock<IDependancy>(); // a függőség mock objektuma Dependant d = new Dependant(mock.Object); // azonnal felhasználható a Setup művelettel beállíthatjuk bármely tagjának viselkedését (Returns(), Throws(), Callback()), a paraméterek szabályozhatóak (It) ELTE IK, Webes alkalmazások fejlesztése 8:26

Mock objektumok pl. : mock.setup(obj => obj.compute()).returns(1); // megadjuk a viselkedést, mindig 1-t ad // vissza mock.setup(obj => obj.check(it.isinrange<double>(0, 10, Range.Inclusive))).Returns(true); mock.setup(obj => obj.check(it.isany<double>()).returns(false); // több eset a paraméter függvényében lehetőségünk van a hívások nyomkövetésére (Verify()) ELTE IK, Webes alkalmazások fejlesztése 8:27

Példa Feladat: Teszteljük az utazási ügynökség weblapját, azon belül pedig a szabad napokat lekérdező webszolgáltatást. egy külön tesztprojektben létrehozzuk a tesztkörnyezetet biztosító osztályt (TravelServiceTest), ezek belül pedig a Get művelet funkcionalitását teszteljük ehhez leválasztjuk az entitásmodell interfészét (ITravelAgencyEntities), amelyet szimulálunk a teszthez (ehhez a Moq programcsomagot használjuk) an entitásmodell mellett a foglalások gyűjteményét (DbSet<Rent>) is szimuláljuk, és az adatokat egy listában adjuk meg ELTE IK, Webes alkalmazások fejlesztése 8:28

Példa Tervezés: ApiController Controllers::RentDateApiController - _service :ITravelService + Get(Int32?, Int32?, Int32?) :IHttpActionResult + RentDateApiController() Tests::TravelServiceTest - _data :IQueryable<Rent> - _entitymock :Mock<ITravelAgencyEntities> - _rentmock :Mock<DbSet<Rent>> + Initialize() :void + TravelServiceGetRentDatesTest() :void «interface» Models::ITravelAgencyEntities + SaveChanges() :Int32 IDisposable «property» + Apartment() :DbSet<Apartment> + Building() :DbSet<Building> + BuildingImage() :DbSet<BuildingImage> + City() :DbSet<City> + Guest() :DbSet<Guest> + Rent() :DbSet<Rent> Models::TravelAgencyEntities ELTE IK, Webes alkalmazások fejlesztése 8:29

Példa Megvalósítás (TravelServiceTest.cs): [TestMethod] public void TravelServiceGetRentDatesTest() { // ellenőrzések júniusra DateTime[] result = service.getrentdates(0, 2016, 06).ToArray(); foreach (DateTime date in _data. Where(rent => rent.apartmentid == 0). Select(rent => rent.startdate)) Assert.IsFalse(content.Contains(date)); ELTE IK, Webes alkalmazások fejlesztése 8:30