【发布时间】:2019-04-18 08:27:49
【问题描述】:
我尝试为 Api Controller 编写单元测试。它是一个 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();
}
那么你到底要怎么写单元测试呢?
我有一个详细视图,然后 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>()
}
【问题讨论】:
-
没有“the”之类的测试来测试某些东西。您必须准确描述您想要测试的什么。这包括您的成员的每个输入和预期输出。换句话说:当您的方法提供以下一组参数时应该做什么......使用这组参数时应该做什么,等等。甚至可能有数百个测试来测试一个方法。
-
无论如何你都没有向我们展示你的控制器的构造函数。我假设它需要一个
ICaseProcess的实例。在这种情况下,new CaseController(ICaseDto<Case>);甚至不会编译。 -
我已经更新了帖子
标签: c# unit-testing asp.net-web-api moq