<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ## 測試 ProductAppService 類 啟動模板附帶測試基礎架構,包括**xUnit**、**Shouldly**和**NSubstitute**庫。它使用*SQLite 內存*數據庫來模擬數據庫,并為每個測試創建一個單獨的數據庫。它會自動初始化數據并在測試結束時銷毀測試數據。通過這種方式,測試不會相互影響,并且您的真實數據庫保持不變。 下面展示在 UI 上使用應用服務之前,如何為`ProductAppService`類的`GetListAsync`方法寫單元測試代碼(\[*第 17 章*\]*構建自動化測試*,將探討測試的所有細節)。 在.Application.Tests項目中創建*Products*文件夾,并在其中創建一個`ProductAppService_Tests`類: ``` using Shouldly; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Xunit; namespace ProductManagement.Products { ????public class ProductAppService_Tests : ProductManagementApplicationTestBase ????{ ????????private readonly IProductAppService _productAppService; ????????public ProductAppService_Tests() ????????{ ????????????_productAppService = ????????????????GetRequiredService<IProductAppService>(); ????????} ????????/* TODO: Test methods */ ????} } ``` 該類繼承自`ProductManagementApplicationTestBase`,它默認集成 ABP 框架和其他基礎設施庫,這樣我們就可以直接使用內置的測試能力。另外,我們使用方法`GetRequiredService`來解決測試代碼中的依賴關系,而不是構造函數注入(這在測試中是不可能的)。 現在,我們可以編寫第一個測試方法。在`ProductAppService_Tests`類中添加如下代碼: ``` [Fact] public async Task Should_Get_Product_List() { ????//Act ????var output = await _productAppService.GetListAsync( ????????new PagedAndSortedResultRequestDto() ????); ????//Assert ????output.TotalCount.ShouldBe(3); ????output.Items.ShouldContain( ????????x => x.Name.Contains("Acme Monochrome Laser Printer") ????); } ``` 該方法調用該`GetListAsync`方法并檢查結果是否正確。如果您打開**測試資源管理器**窗口(在 Visual Studio 中的**查看**|**測試資源管理器**菜單下),您可以看到我們添加的測試方法。**測試資源管理器**用于顯示和運行解決方案中的測試: ![](https://img.kancloud.cn/27/e7/27e771f166f57bda9a903fc0a82a4529_720x238.png) 運行測試到檢查它是否按預期工作。如果方法正常工作,將在測試方法名稱的左側看到一個綠色圖標。 ## 自動 API 控制器和 Swagger UI **Swagger**一款服務于開發和測試HTTP API 的的流行工具。它啟動模板中已經預先裝了。 設置.Web項目為啟動項目,然后*按 Ctrl*+*F5*運行該項目,啟動后,輸入`/swagger` URL,如圖所示: ![](https://img.kancloud.cn/f9/5b/f95b7e5ebade4297b7ec78ff057967a8_726x484.png) 你會看到內置的很多 API。如果向下滾動,也會看到一個**Product**接口。您可以對其進行測試以獲取產品列表: ![](https://img.kancloud.cn/0c/06/0c06ff94615b82711460f342bb159743_655x213.png) >[warning] 我們沒有創建*ProductController*接口。這個接口是如何出現的? 這里運用的是ABP 框架的**自動 API 控制器**功能。它會根據命名約定和配置自動將您的應用服務公開為 HTTP API(通常,我們不會手動編寫控制器)。 自動 API 控制器功能將在\[*第 14 章*\] *構建 HTTP API 和實時服務* 中詳細介紹。 有了 HTTP API 來獲取產品列表。下一步是在客戶端代碼中使用此 API。 ## 動態 JavaScript 代理 通常,您通過 JavaScript 調用 HTTP API 接口。ABP 會為所有 HTTP API 動態創建客戶端代理。然后,就可以使用這些動態 JavaScript 函數從客戶端調用我們的 API。 再次運行[*ProductManagement.Web*](http://ProductManagement.Web)項目,并在登錄頁面上使用*F12*快捷鍵打開瀏覽器的**開發者控制臺**,然后輸入以下 JavaScript 代碼: ``` productManagement.products.product.getList({}).then(function(result) { ????console.log(result); }); ``` 執行此代碼后,將向服務器發出請求,并將返回結果記錄在**Console**選項卡中,如圖所示: ![](https://img.kancloud.cn/c5/a6/c5a6bead0c97506082d30824ff752a8a_787x542.png) 我們可以看到返回的產品列表數據顯示在**控制臺**選項卡中。這意味著我們可以輕松地運用 JavaScript 調用服務器端 API,而無需處理低級細節。 如果您想知道JavaScript 是在哪里定義`getList`的,您可以定位到`/Abp/ServiceProxyScript`地址,查看由 ABP 框架動態創建的 JavaScript 代理函數。 在下一節,我們將創建一個**Razor 頁面**并在 UI 上顯示產品表。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看