ASP.NET ZERO 學習 —— (12) 應用開發Demo之測試應用服務

單元測試

如果你對自動化測試不感興趣可以跳過本節。

通過編寫單元測試,我們可以不經過用戶界面來直接測試 PersonAppService.GetPeople 方法。

我們在.Tests項目中編寫單元測試。首先我們先創建一個獲取全部人員的單元測試:

    public class PersonAppService_Tests : AppTestBase
    {
        private readonly IPersonAppService _personAppService;

        public PersonAppService_Tests()
        {
            this._personAppService = Resolve<IPersonAppService>();
        }

        [Fact]
        public void Should_Get_All_People_Without_Any_Filter()
        {
            //Act
            var persons = this._personAppService.GetPeople(new GetPeopleInput());

            //Assert
            persons.Items.Count.ShouldBe(2);
        }
    }

我們的測試類繼承與AppTestBase,AppTestBase類進行了系統的初始化,創建虛擬的內存數據庫,在數據庫中創建了初始化數據(前面的Seed文件)並模擬Admin身份登錄了系統。所以,其實這是一個集成測試。

在測試類構造函數中,我們從依賴注入容器中獲取了IPersonAppService ,它構造了PersonAppService 類和所有的依賴。然後我們就可以在測試中使用這個方法了。

因爲使用的是XUnit,我們需要在每個測試方法前添加Fact屬性。在這個測試方法裏,我們調用了GetPeople方法,並檢查它是否返回2個人,正如前面我們在Seed文件中添加的那樣。

再來看AppTestBase基類

        protected AppTestBase()
        {
            //Seed initial data for host
            AbpSession.TenantId = null;
            UsingDbContext(context =>
            {
                context.EntityChangeEventHelper = NullEntityChangeEventHelper.Instance;
                context.EventBus = NullEventBus.Instance;

                new InitialHostDbBuilder(context).Create();
                new DefaultTenantBuilder(context).Create();
                //Add
                new InitialPeopleCreator(context).Create();
            });

            //Seed initial data for default tenant
            var defaultTenantId = 1;
            AbpSession.TenantId = defaultTenantId;
            UsingDbContext(context =>
            {
                context.EntityChangeEventHelper = NullEntityChangeEventHelper.Instance;
                context.EventBus = NullEventBus.Instance;

                new TenantRoleAndUserBuilder(context, defaultTenantId).Create();
                new TestDataBuilder(context, defaultTenantId).Create();
            });

            LoginAsDefaultTenantAdmin();
        }

在構造函數中,進行了數據的初始化,所以需要增加InitialPeopleCreator方法的調用。

當我們在測試資源管理器中運行該測試後,會如下圖所示:
這裏寫圖片描述

如你所見,測試通過。現在,我們知道PersonAppService 在沒有任何Filter的情況下能正常運行。下面,我們來添加一個新的單元測試,來使用Filter屬性過濾。

    [Fact]
    public void Should_Get_People_With_Filter()
    {
        //Act
        var persons = this._personAppService.GetPeople(
            new GetPeopleInput
            {
                Filter = "Chow"
            });

        //Assert
        persons.Items.Count.ShouldBe(1);
        persons.Items[0].Name.ShouldBe("Alistair");
        persons.Items[0].Surname.ShouldBe("Chow");
    }

因爲我們知道初始數據,所以檢查返回結果很容易。這裏,初始化測試數據非常重要,當我們改變了初始數據,即使我們的的服務是正確,測試也可能會失敗。所以,單元測試最好是針對獨立的初始數據來進行測試。我們檢查傳入的數據,看看是否有人的姓,名或郵箱地址裏包含”Chow”。因此,如果我們添加新的Person到初始化數據,我們的測試仍然可以正常運行。

在單元測試裏有很多技巧,這裏只是最簡單的例子。但ASP.NET Zero框架能通過使用基類和預生成測試代碼,能很容易編寫單元測試和集成測試。

通過瀏覽器控制檯進行測試

現在,我們運行並登錄這個應用,並打開Chorme 的開發者工具(或者在其他瀏覽器裏的類似的工具)並編寫下面的命令:

這裏寫圖片描述

這個命令會執行Ajax調用PersonAppService的GetPeople方法。我們可以在Network標籤下看這個請求:

這裏寫圖片描述

正如我們所見,Ajax請求成功獲取到人員信息。

所以,它通過什麼機制運行的?我們怎麼可以使用類似於Javascript的語法來調用C#類的方法?這是ABP框架提供的。見動態Web API 層瞭解更多。你可以隨時使用控制檯來調用應用服務來調試或查看返回Json的結構。

我們也可以查看請求的日誌信息。打開AbpAuditLogs表就會看到下面的信息:

這裏寫圖片描述

有很多其他的字段上圖並沒有顯示出來。這裏我們可以看到 ID = 2的用戶調用了PersonAppService的GetPeople方法,參數,還有他的執行時間。

發佈了98 篇原創文章 · 獲贊 54 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章