《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第9章)-- 讀書筆記(上)

第 9 章 測試和文檔
9.1 測試
測試是軟件生命周期中的一個非常重要的階段,對于保證軟件的可靠性具有極其重要的意義
常見的測試方法有很多,根據(jù)不同的維度,可以把測試方法分為不同的類別
從觀察結(jié)構(gòu)的透明性方式上,分為白盒測試、黑盒測試和灰盒測試
從測試執(zhí)行方式上,分為手動測試和自動化測試
從測試所涉及的層次上,分為單元測試、集成測試和系統(tǒng)測試
單元測試由開發(fā)人員完成,主要用來測試程序中的類以及其中的方法是否能夠正確運(yùn)行
在添加單元測試方法時,應(yīng)遵循 Arrange-Act-Access 模式,使測試方法的代碼更加規(guī)范,該模式指明了每個測試方法由以下3部分組成:
Arrange:為測試進(jìn)行準(zhǔn)備操作,如設(shè)置測試數(shù)據(jù)、變量和環(huán)境等
Act:執(zhí)行要測的方法,如調(diào)用要測試的函數(shù)和方法
Assert:斷言測試結(jié)果,驗(yàn)證被測試方法的輸出是否與預(yù)期的結(jié)果一致
我們使用 xUnit 測試框架,為項(xiàng)目命名為 Library.API.Testing
項(xiàng)目創(chuàng)建完成后,將默認(rèn)的 UnitTest1.cs 刪除,并添加一個新類,名為 AuthorController_UnitTests,該類主要包含針對 AuthorController 中方法的測試方法
由于 AuthorController 的構(gòu)造函數(shù)中引用了多個其他依賴項(xiàng),如 IRepositoryWrapper 和 IMapper 等,可以使用 Moq 庫來模擬
namespace Library.API.Testing
{
public class AuthorController_UnitTests
{
private AuthorController _authorController;
private Mock _mockDistributedCache;
private Mock> _mockLogger;
private Mock _mockMapper;
private Mock _mockRepositoryWrapper;
private Mock _mockUrlHelper;
public AuthorController_UnitTests()
{
_mockRepositoryWrapper = new Mock();
_mockMapper = new Mock();
_mockLogger = new Mock>();
_mockDistributedCache = new Mock();
_mockUrlHelper = new Mock();
_authorController = new AuthorController(_mockMapper.Object,
_mockRepositoryWrapper.Object,
_mockLogger.Object,
_mockDistributedCache.Object);
_authorController.ControllerContext = new ControllerContext
{
HttpContext = new DefaultHttpContext()
};
}
}
}
在 AuthorController 中用到了 Response 屬性,該屬性可以控制 HTTP 響應(yīng),如在 GetAuthorsAsync 方法中使用它為響應(yīng)添加了自定義消息頭
Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetedata));
已實(shí)例化的 AuthorController 的 Response 屬性默認(rèn)為空,通過設(shè)置 ControllerContext,使得 AuthorController 對象的 Request 和 Response 屬性將不再為空
接下來對 GetAuthorsAsync 添加測試方法
[Fact]
public async Task Test_GetAuthorsAsync()
{
// Arrange
var author = new Author
{
Id = Guid.NewGuid(),
Name = "Author Test 1",
Email = "[email protected]"
};
var authorDto = new AuthorDto
{
Id = author.Id,
Name = author.Name,
Email = author.Email,
};
var authorList = new List {author};
var authorDtoList = new List {authorDto};
var parameters = new AuthorResourceParameters();
var authors = new PagedList(authorList, totalCount: authorList.Count,
pageNumber: parameters.PageNumber, pageSize: parameters.PageSize);
_mockRepositoryWrapper.Setup(m => m.Author.GetAllAsync(It.IsAny()))
.Returns(Task.FromResult(authors));
_mockMapper.Setup(m => m.Map>(It.IsAny>()))
.Returns(authorDtoList);
_mockUrlHelper.Setup(m => m.Link(It.IsAny(), It.IsAny 上面的測試方法遵循了 Arrange-Act-Assert 的模式
當(dāng)數(shù)據(jù)準(zhǔn)備好后,調(diào)用待測試的方法,并得到該方法的返回值,之后使用 Assert 類提供的靜態(tài)方法來驗(yàn)證結(jié)果是否符合預(yù)期
相關(guān)文章
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第8章)-- 讀書筆記(尾)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第8章)-- 讀書筆記(下)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第8章)-- 讀書筆記(中)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第8章)-- 讀書筆記(上)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第7章)-- 讀書筆記(下)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第7章)-- 讀書筆記(中)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第7章)-- 讀書筆記(上)
《ASP.NET Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第6章)-- 讀書筆記(下)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第6章)-- 讀書筆記(上)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第5章)-- 讀書筆記(下)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第5章)-- 讀書筆記(中)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第5章)-- 讀書筆記(上)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第4章)-- 讀書筆記(下)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- (第4章)-- 讀書筆記(上)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》(第3章)-- 讀書筆記(下)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》(第3章)-- 讀書筆記(中)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》(第3章)-- 讀書筆記(上)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- 讀書筆記(第2章)
《ASP.ENT Core 與 RESTful API 開發(fā)實(shí)戰(zhàn)》-- 讀書筆記(第1章)
