[英]Unit test for Api controller
我嘗試為Api控制器編寫單元測試。 這是一個C#mvc應用程序。 Moq也可以使用單元測試。
這是控制器:
public sealed class CaseController : ApiControllerBase
{
[HttpGet]
[Route("{id:int}")]
public ICaseDto<object> Get(int id)
{
return _caseProcess.GetCase(id);
}
}
這是接口:
public interface ICaseProcess
{
ICaseDto<object> GetCase(int id);
}
這是方法:
internal sealed class CaseProcess : ProcessBase, ICaseProcess
{
public ICaseDto<object> GetCase(int id)
{
var caseEntity = GetCaseById(id);
CaseProcessHelper helper = GetHelper(caseEntity);
object details = helper.GetReferenceDetails();
ICaseDto<object> resultDto = CaseDto.Create(details);
Mapper.Map(caseEntity, resultDto);
return resultDto;
}
}
我嘗試這樣編寫單元測試:
[TestMethod]
public void CaseConroller_ReturnDetailData_Test()
{
//Arrange
var dto = new Case();
var mockService = new Mock<ICaseProcess>();
var Casecontroller = new CaseController(ICaseDto<Case>);
var expected = new CaseEditDto();
//var dataSource = new
CaseProcess.Setup(a => a.Should(dto))
//Act
// var result = "hallo";
//Assert
result.Should().BeEquivalentTo();
}
那么,您必須如何精確地編寫單元測試?
我有一個Detail視圖,然后Api必須返回細節視圖的數據。
id是一個int,例如: api/support/cases/100000002
。
構造函數如下所示:
public CaseController(ICaseProcess caseProcess)
{
_caseProcess = caseProcess;
}
我現在有這樣的東西:
//Arrange
var dto = new Case();
var mockService = new Mock<ICaseProcess>();
var casecontroller = new CaseController(CaseProcess.Object);
var expected = new CaseEditDto();
//Act
var result = casecontroller.Get(100000001);
//Assert
result.Should().BeEquivalentTo(expected);
但是輸出是這樣的:
{
"details": {
"name": "Val van Urquhart",
"dateOfBirth": "11 september 1933"
},
"dateSubmittedFormatted": "1 januari 2018",
"dateClosedFormatted": null,
"sample": false,
"comments": [
{
"id": 1,
"account": "todo@local.nl",
"date": "08-11-2018 17:13",
"text": "ABC"
}
],
"id": 100000001,
"status": 103,
"substatus": null,
"verdict": null,
"owner": 101,
"dateSubmitted": "01-01-2018",
"dateClosed": null,
"type": 100,
"reference": "123459850"
}
我這樣嘗試:
[TestMethod]
public void CaseController_GetCase_Test()
{
var CaseObject = new CaseDto<object>()
{
Id = 100000001,
Verdict = null,
DateSubmitted = "01-01-2018",
DateClosed = null,
Reference = "123459850"
};
var CaseTest = new CaseEditDto<object>();
// Case entity = UnitOfWork.GetRepository<Case>()
}
根據顯示的代碼段,假設控制器看起來像
public sealed class CaseController : ApiControllerBase {
private readonly ICaseProcess caseProcess;
public CaseController(ICaseProcess caseProcess) {
this.caseProcess = caseProcess;
}
[HttpGet]
[Route("{id:int}")]
public ICaseDto<object> Get(int id) {
return caseProcess.GetCase(id);
}
}
一個非常簡單的測試是模擬依賴項,將其注入到測試對象中,進行測試,然后斷言預期的行為
[TestMethod]
public void CaseConroller_ReturnDetailData_Test() {
//Arrange
//mock the dependency
var id = 100000001;
var expected = Mock.Of<ICaseDto<object>>();
var mockService = new Mock<ICaseProcess>();
mockService.Setup(_ => _.GetCase(id)).Returns(expected);
//inject it into the subject under test
var subject = new CaseController(mockService.Object);
//Act
var actual = subject.Get(id); //exercise the test
//Assert
//assert the expected behavior
actual.Should().BeEquivalentTo(expected);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.