Anzeige

ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing

DotNet開發聖殿
13. Jan 2019
Anzeige

Más contenido relacionado

Anzeige

Último(20)

ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing

  1. ASP.NET Core MVC 2.2
 從開發到測試 聖殿祭司。奚江華
  2. 個⼈人背景簡介 著有ASP.NET 2.0、3.5、4.5、4.6等熱⾨門𣈱銷書籍,以 及ASP.NET MVC 5.x範例例完美演繹 歷任台灣微軟MSDN、TechEd、TechDay研討會講師 曾數屆當選微軟MVP 國內各⼤大上市公司及⼤大專院校之培訓講師 曾發表⽂文章刊於ITHOME電腦週刊
  3. ASP.NET Core MVC 2.2課程 聖殿祭司的課程簡介
  4. https://www.codemagic.com.tw/ https://www.facebook.com/CodeMagicTw/
  5. Bootstrap 在MVC中的整合應⽤用 Chart.js / JSON與Core Web API整合 Razor Pages新型態開發專案 Tag Helpers與View Components Entity Framework Core資料庫存取 Unit Test單元測試 Routing路路由實戰案例例 將ASP.NET Core MVC部署到Azure雲端 ASP.NET Core MVC 2.2課程綱要 .NET Core跨平台開發環境與CLI⼯工具 Web Hosting主機設定與管理理 ⽤用Configuration框架管理理組態設定 IoC Container與Dependency Injection ⽤用Middleware中介軟體處理理HTTP Pipeline Dev, Staging及Production
 多重環境的應⽤用 ⽤用Logging API記錄系統資訊
  6. Agenda(1) .NET Core基礎資訊, .NET Core vs. .NET Framework ⽤用CLI tools管理理你的專案 ASP.NET Core 2.x版本差異異 MVC 5遷移之結構變更更 以Card⼈人物牌卡為例例 Routing路路由
  7. Agenda(2) Unit Testing單元測試 Dependency Injection ASP.NET Core 2.2新鮮事
  8. .NET Core基礎資訊
  9. 跨平台 Windows平台 .NET Core .NET Framework ASP.NET Core ASP.NET ASP.NET Core MVC ASP.NET MVC .NET Core與.NET名詞對比
  10. 兩兩種.NET Core開發途徑 Visual Studio 2017 & 2019 CLI + ⽂文字編輯器 ( Visual Studio Code, vim, Atom…) Visual Studio 2017/2019 Visual Studio for Mac Visual Studio Code .NET Core CLI tools
  11. 內建Fundamentals基礎服務
  12. ASP.NET Core四個靈魂⼈人物 Web Host:負責應⽤用程式啟動/⽣生命週期管理理 Configuration:作為組態管理理系統 Dependency Injection:注入相依性服務 Middleware:組成HTTP Pipeline,處理理請求
  13. .NET Core特⾊色與賣點 Cross-platform Consistent across architecture Command-line tools Flexible deployment Compatible Open source Supported by Microsoft
  14. .NET的野⼼心與企圖⼼心 DESKTOP WEB CLOUD MOBILE GAMING IoT AI .NET
  15. .NET Core vs. .NET Framework 怎麼選?
  16. .NET Core / .NET Framework
  17. Choosing .NET Core Cross-platform Targeting microservices Using Docker containers High-performance and scalable Side-by-side .NET versions
  18. Choosing .NET Framework Your app uses third-party .NET libraries or NuGet packages not available for .NET Core. Your app uses .NET technologies that aren't available for .NET Core. Your app uses a platform that doesn’t support .NET Core.
  19. ASP.NET Core 2.x版本差異異
  20. 三種ASP.NET Core選擇 ASP.NET Core MVC 2.0 / 2.1 / 2.2 ? ASP.NET Core 2.0不考慮 jQuery Validation v1.14.0 ASP.NET Core 2.1 Bootstrap 3.3.7 + jQuery ASP.NET Core 2.2 Bootstrap 4.1.3 + jQuery 3.3.1
  21. ASP.NET Core 2.0, 2.1, 2.2 三者看似相同的⼩小改版,怎麼選? ASP.NET Core 2.0:Execution Performance Microsoft.AspNetCore.All ( metapackage ) ASP.NET Core 2.1:Build & Execution Performance ASP.NET Core 2.2:Functional ,APIs Performance ASP.NET Core 2.1 & 2.2 Shared Framework — Microsoft.AspNetCore.App, *.All
  22. Runtime Package Store ASP.NET Core 2.0 /usr/local/share/dotnet/store/x64/netcoreapp2.0 ASP.NET Core 2.1 & 2.2 /usr/local/share/dotnet/shared/Microsoft.AspNetCore.app/
  23. ASP.NET Core MVC 2.1樣板
  24. ASP.NET Core MVC 2.2樣板
  25. MVC 5遷移之結構變更更 從MVC 5移轉到ASP.NET Core 2.1
  26. Web Root Content Root
  27. MVC5遷移後哪些東⻄西消失? Global.asax檔 ➔ Startup.cs Web.config檔 ➔ appsettings.json (組態值, 資料庫連線) Content, fonts資料夾移⾄至➔ wwwroot資料夾 App_Start資料夾消失了了 BundleConfig.cs檔( Bundle & Minification ) FilterConfig.cs檔 ( Filtering ) RouteConfig.cs檔 ( 路路由 ) ➔ Main()
  28. MVC 5哪些機制沿⽤用? Controllers ( ViewData, ViewBag, Model ) ActionResult ➔ IActionResult Models, Model Annotation Model Validation Model Binding Razor Views, Partial View( .cshtml ), but Tag Helpers Scaffolding CRUD(Model ➔ Controller & Views)
  29. MVC 5哪些保留留,但改變了了? NuGet package & Reference在專案中位置和形式改變 Routing路路由設定位置改變了了 Filter設定位置改變了了 Scaffolding CRUD Tag Helpers為主 ,Html Helpers為輔 EF - Dependency Injection, Options Pattern Action - IActionResult, Async web.config <connectionString> ➔ appsettings.json
  30. ASP.NET Core新增了了哪些? .NET Core SDK , CLI命令 ASP.NET Core Fundamentals 四⼤大⽀支柱 Hosting, Configuration, Dependency Injection, Middleware Tag Helpers ( 變成Razor View的主⾓角 ) View Components ( View可直接存取資料庫 ) _ViewImport.cshtml替Views加上共⽤用的命名空間參參考 Logging
  31. 以Card⼈人物牌卡為例例 從MVC 5移轉得到體悟
  32. MVC 5 App的組成 圖片, css, js Model Controller View,Partial View DbContext 資料庫Connection EF程式
  33. 移轉項⽬目(1) Content(css, js, image , fonts) ➔ wwwroot Controller ➔ ActionResult : IActionResult Model (沒有變化) Views ➔ Razor View, Partial View ( Tag Helpers) _ViewImports.cshtml ( View參參考的命名空間 ) 變更更所有專案的namespace命名空間名稱
  34. 移轉項⽬目(2) Bundling & Minification Removed @Styles.Render(…) , @Scripts.Render(…) Dead _Layout.cshmtl @Style.Render(…), @Script.Render(…) Removed @RenderSection() is alive 加入ASP.NET Core Environment
  35. Partial View部分檢視異異動 舊語法: @Html.Partial("_CardPartial", model) 新語法: <partial name="_CardPartial" model="model" /> @await Html.PartialAsync("_CardPartial", model) @{await Html.RenderPartialAsync("_CardPartial", model); }
  36. 以⼈人物牌卡為例例 從哪跌倒,再從哪站起來來
  37. Routing路路由
  38. Routing Types Convention Route Attribue Route
  39. Unit Testing單元測試
  40. .NET Core內建單元測試框架 dotnet new dotnet new mstest Templates Short Name Language Tags ----------------------------------------------------------------------- Unit Test Project mstest [C#], F#, VB Test/MSTest NUnit 3 Test Project nunit [C#], F#, VB Test/NUnit xUnit Test Project xunit [C#], F#, VB Test/xUnit
  41. VS 2017單元測試專案樣板
  42. MSTest using Microsoft.VisualStudio.TestTools.UnitTesting; namespace CoreRazor.MSTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
  43. NUnit using NUnit.Framework; namespace Tests { public class Tests { [SetUp] public void Setup() { } [Test] public void Test1() { Assert.Pass(); } } }
  44. xUnit using Xunit; namespace CoreRazor.xUnit { public class UnitTest1 { [Fact] public void Test1() { } } }
  45. 3A原則 (AAA) Public void TestMethod() { //Arrange … //Act … //Assert … } 初始化、配置、設定 動作(執⾏行行) 斷⾔言(評估執⾏行行結果預期)
  46. Unit Test — Bad Naming Public void Test_SqrtValue() { //Arrange Var Calc = new Calc(); //Act Var sqrtValue = Calc.GetSqrt(4); //Assert Assert.Equal(2, sqrtValue); } 初始化 動作(執⾏行行) 斷⾔言(評估執⾏行行結果預
  47. Unit Test — Good Naming Public void GetSqrt_SingleNumber_ReturnrSqrtValue() { //Arrange Var Calc = new Calc(); //Act Var sqrtValue = Calc.GetSqrt(4); //Assert Assert.Equal(2, sqrtValue); } MethodName_TestScenario_ExpectedBehavior
  48. 三個測試相關⼯工具 Test Explorer Live Testing即時測試 Code Coverage程式碼覆蓋率
  49. 單元測試的運⽤用
  50. Dependency Injection 相依性注入
  51. What’s Dependency ? Dependency中⽂文是依賴 “依賴”是指⼀一個object需要另⼀一個object物件 例例如⼀一個⼈人需要⽔水,因⽽而對⽔水產⽣生依賴關係 在Class類別中使⽤用依賴物件,常⽤用new Instance FubonBankServices service = new FubonBankServices()
  52. 但~相依特定實作是不好的 FubonBankServices service = new FubonBankServices() EsunBankServices service = new EsunBankServices() 相依特定實作,⼀一旦替換實作,所有類別程式必須修改 在專案中⼀一堆類別程式初始FubonBankServices,若若 FubonBankSevices需要組態,會在專案的各⾓角設定組態 未實作interface介⾯面,導致單元測試難以Mocking或Stubing
  53. 如何解決直接相依性問題? 利利⽤用IoC控制反轉技巧,解耦直接相依性 ⽤用interface介⾯面抽象化特定實作,依賴介⾯面,不依賴實作 Services繼承並實作interface介⾯面 在ASP.NET Core中Startup類別中註冊Services服務 在app程式中以Dependency Injection注入Service服務 Classes, Controllers, Views…
  54. 定義interface介⾯面:IBankService public interface IBankService { string BankId { get; } //銀行代碼 string BankName { get }; //銀行名稱 bool Withdraw(decimal dollars); //提款 bool Deposit(decimal dollars); //存取 decimal AccountBalance(int depositorId); //銀行餘額 }
  55. Services繼承並實作interface介⾯面 public class FubonBankService : IBankService { public string BankId { get; private set; } public string BankName { get; private set; } public FubonBankService() { BankId = "012"; BankName = "台北富邦銀行"; } … } public class EsunBankService : IBankService { public string BankId { get; private set; } public string BankName { get; private set; } public EsunBankService() { BankId = "808"; BankName = "玉山銀行"; } ... } 富邦銀⾏行行繼承介⾯面 ⽟玉⼭山銀⾏行行繼承介⾯面
  56. 在IoC container註冊服務 public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddTransient<IBankService, FubonBankService>(); } ... } 介⾯面 實作Lifetime模式
  57. 在Controller使⽤用DI注入服務 public class BankServicesController : Controller { private readonly IBankService _bankService; public BankServicesController(IBankService bankService) { _bankService = bankService; } public IActionResult InjectAction([FromServices] IBankService myBankService) { var bankModel = myBankService; return View(bankModel); } } 在建構式注入服務 在Action注入服務 Service看不⾒見見特定實作名稱 套⽤用Attribute
  58. 在View直接以@inject注入服務 @inject IBankService BankService <ul> <li>銀行代碼 : @BankService.BankId</li> <li>銀行名稱 : @BankService.BankName</li> <li>存款餘額 : @BankService.AccountBalance(10872)</li> </ul> 2.注入Service服務實例例 1.Inject指⽰示詞 3.使⽤用Service服務
  59. 註冊服務的三種Lifetime指令 AddScoped⽅方法—Scoped lifetime service are created once per request AddTransient⽅方法 — Transient lifetime service are created each time they're requested AddSingleton⽅方法 — Singleton lifetime service are only created at the first request time
  60. DI可應⽤用到哪些類型程式? App Startup ( Startup.cs ) Controllers / Action Views Custom Classes , Services Custom Middleware Components
  61. DI相依性注入的運⽤用
  62. ASP.NET Core 2.2新鮮事
  63. Better integration with popular Open API (Swagger) libraries including design-time checks with code analyzers Introduction of Endpoint Routing with up to 20% improved routing performance in MVC Improved URL generation with the LinkGenerator class & support for route Parameter Transformers (and a post from Scott Hanselman) New Health Checks API for application health monitoring Up to 400% improved throughput on IIS due to in-process hosting support Up to 15% improved MVC model validation performance Problem Details (RFC 7807) support in MVC for detailed API error results Preview of HTTP/2 server support in ASP.NET Core Template updates for Bootstrap 4 and Angular 6 Java client for ASP.NET Core SignalR Up to 60% improved HTTP Client performance on Linux and 20% on Windows http://bit.ly/2sn6oWT
  64. .NET Core Roadmap .NET Core 2.2 2018 /12⽉月正式版 Visual Studio 2019 • 2018 /12⽉月預覽版 • 2019上半年年 Final正式版 • .NET Core 3.0 • 2018 /12⽉月預覽版 • 2019下半年年 Final正式版 Entity Framework Core 3.0 with .NET Core 3.0 
  65. The End
Anzeige