我正在開發一個具有RESTful API的服務。該API基於JSON,並使用HAL作爲資源之間的HATEOAS鏈接。測試HATEOAS URL
實現不應該問題,但我使用Java和Spring MVC。
一些示例請求:
GET /api/projects
{
"_links" : {
"self" : {
"href" : "example.org/api/projects"
},
"projects" : [ {
"href" : "example.org/api/projects/1234",
"title" : "The Project Name"
}, {
"href" : "example.org/api/projects/1235",
"title" : "The Second Project"
} ]
},
"totalProjects" : 2,
}
GET /api/projects/1234
{
"_links" : {
"self" : {
"href" : "example.org/api/projects/1234"
},
"tasks" : [ {
"href" : "example.org/api/projects/1234/tasks/543",
"title" : "First Task"
}, {
"href" : "example.org/api/projects/1234/tasks/544",
"title" : "Second Task"
} ]
},
"id" : 1234,
"name" : "The Project Name",
"progress" : 60,
"status" : "ontime",
"targetDate" : "2014-06-01",
}
現在,我應該如何測試GET請求到一個單一的項目?我有兩個選擇,我不知道哪一個更好:
測試在測試
/api/projects/{projectId}
,與模擬服務層期望/回報項目的ID替換{projectId}
。先請求
/api/projects/
然後測試響應中返回的鏈接。所以測試將不會有/api/projects/{projectId}
硬編碼。
第一個選項,使測試更加簡單,但它基本上是在硬編碼的URL,這是事HATEOAS的目的是要避免在首位。如果我因某種原因改變了URL結構,測試也需要改變。
第二種選擇在HATEOAS意義上更「正確」,但測試會更加複雜;我需要遍歷所有的父資源來測試一個子資源。例如,要測試任務的GET請求,我需要請求/api/projects/
,獲取到/api/projects/1234
的鏈接,請求並獲取到/api/projects/2345/tasks/543
的鏈接,最後測試一下!如果我以這種方式測試,我還需要在每個測試中嘲笑更多。
第二個選項的優點是我可以在不更改測試的情況下自由更改URL。