單元測試
如果你對自動化測試不感興趣可以跳過本節。
通過編寫單元測試,我們可以不經過用戶界面來直接測試 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方法,參數,還有他的執行時間。