C# 单元测试Web API IHttpActionResponse状态代码
我正在进行一个单元测试项目,以测试返回类型为C# 单元测试Web API IHttpActionResponse状态代码,c#,unit-testing,asp.net-web-api2,moq,mstest,C#,Unit Testing,Asp.net Web Api2,Moq,Mstest,我正在进行一个单元测试项目,以测试返回类型为IHttpActionResponse的WebAPIv2 我无法找到使用IHttpActionResponse返回类型测试所有状态代码的方法。尤其是post需要测试创建的http状态代码。在这里,我还为Get和GetById创建了一些测试。让我知道如何测试返回IHttpActionResponse的所有状态代码 API控制器代码 public class StudentController : ApiController { IReposito
IHttpActionResponse
的WebAPIv2
我无法找到使用IHttpActionResponse
返回类型测试所有状态代码的方法。尤其是post需要测试创建的http状态代码。在这里,我还为Get
和GetById
创建了一些测试。让我知道如何测试返回IHttpActionResponse
的所有状态代码
API控制器代码
public class StudentController : ApiController
{
IRepository<Student> repository;
ITransformers<StudentModel, Student> transformer;
public StudentController(IRepository<Student> studentRepository, ITransformers<StudentModel, Student> studentTransformer)
{
repository = studentRepository;
transformer = studentTransformer;
}
[HttpGet]
public IHttpActionResult Get()
{
IEnumerable<Student> students = null;
try
{
students = repository.Get();
if (students.Count<Student>() > 0)
{
return Ok(students);
}
else
{
return StatusCode(HttpStatusCode.NoContent);
//return Content(HttpStatusCode.NoContent, students);
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
[HttpGet]
public IHttpActionResult Get(int Id)
{
Student student = null;
try
{
student = repository.GetById(Id);
if (student != null)
{
return Ok(student);
}
else
{
return NotFound();
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
[HttpPost]
public IHttpActionResult Post(StudentModel studentModel)
{
try
{
Student student = transformer.TransformModelToEntity(studentModel);
int result = repository.Save(student);
if (result > 0)
{
student.Id = result;
return Content(HttpStatusCode.Created, student);
}
else
{
return InternalServerError();
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
[HttpPut]
public IHttpActionResult Put(StudentModel studentModel)
{
try
{
Student student = transformer.TransformModelToEntity(studentModel);
if (repository.Update(student))
{
return Content(HttpStatusCode.Accepted, studentModel);
}
else
{
return NotFound();
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
[HttpDelete]
public IHttpActionResult Delete(int Id)
{
try
{
if(repository.Delete(Id))
{
return Ok();
}
else
{
return NotFound();
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
}
BadRequest的试验方法
[TestMethod]
public void PostReturnsBadRequest()
{
// Arrange
//var mockFilter = new Mock<ModelStateValidationFilter>().Setup(x=>x.OnActionExecuting(It.IsAny<HttpActionContext>()))
var controller = new StudentController(mockRepository.Object, mockTransformer.Object);
// Act
IHttpActionResult actionResult = controller.Post(new StudentModel { Id = 0, FirstName = "Raju", LastName = "", CourseId = 0 });
var badResult = actionResult as NegotiatedContentResult<Student>;
//Assert
Assert.IsNotNull(actionResult);
Assert.IsInstanceOfType(actionResult, typeof(BadRequestErrorMessageResult));
//TODO: Check for status code bad request and
Assert.IsNotNull(badResult.Content);
Assert.AreEqual(HttpStatusCode.Created, badResult.StatusCode);
}
[TestMethod]
公共无效PostReturnsBadRequest()
{
//安排
//var mockFilter=new Mock().Setup(x=>x.OnActionExecuting(It.IsAny()))
var controller=newstudentcontroller(mockRepository.Object、mockTransformer.Object);
//表演
IHttpActionResult actionResult=controller.Post(新的StudentModel{Id=0,FirstName=“Raju”,LastName=”,CourseId=0});
var badResult=作为NegotiatedContentResult的actionResult;
//断言
Assert.IsNotNull(actionResult);
IsInstanceOfType(actionResult,typeof(BadRequestErrorMessageResult));
//TODO:检查状态代码错误请求和
Assert.IsNotNull(badResult.Content);
Assert.AreEqual(HttpStatusCode.Created、badResult.StatusCode);
}
其中,模型中的lastname是必需的,因此API将返回BadRequest。但是如何在单元测试中模拟这种行为呢?成功后,Post(StudentModel StudentModel)
方法将返回一个NegotiatedContentResult
return Content(HttpStatusCode.Created, student);
然而postReturnsAccess
测试试图将其转换为
var createdResult = actionResult as CreatedNegotiatedContentResult<Student>;
//var createdResult = actionResult as CreatedAtRouteNegotiatedContentResult<Student>;
var createdResult=actionResult作为CreatedNegotiatedContentResult;
//var createdResult=actionResult作为createDatRouteneGottatedContentResult;
更新测试以匹配操作的预期内容,然后检查预期状态代码
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<StudentModel>());
var createdResult = actionResult as NegotiatedContentResult<Student>;
//Assert
Assert.IsNotNull(actionResult);
Assert.IsNotNull(createdResult.Content);
Assert.AreEqual(1, createdResult.Content.Id);
Asssert.AreEqual(HttpStatusCode.Created, createdResult.StatusCode); // <-- check status
//Act
IHttpActionResult actionResult=controller.Post(It.IsAny());
var createdResult=作为NegotiatedContentResult的actionResult;
//断言
Assert.IsNotNull(actionResult);
Assert.IsNotNull(createdResult.Content);
AreEqual(1,createdResult.Content.Id);
Asssert.AreEqual(HttpStatusCode.Created,createdResult.StatusCode);//谢谢你的更新。不知道控制器方法返回哪种类型的ContentResults。我们有任何相同的文档吗?我也在使用自定义筛选器验证模型状态并返回无效的BadRequest id状态。我很难在单元测试中模拟这种行为,因为这是来自customfilter的,并且该方法没有Return类型。用代码更新了问题。@user3625533文档。对于过滤器,您必须在单元测试中直接测试过滤器,或者在集成测试中间接测试过滤器,
return Content(HttpStatusCode.Created, student);
var createdResult = actionResult as CreatedNegotiatedContentResult<Student>;
//var createdResult = actionResult as CreatedAtRouteNegotiatedContentResult<Student>;
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<StudentModel>());
var createdResult = actionResult as NegotiatedContentResult<Student>;
//Assert
Assert.IsNotNull(actionResult);
Assert.IsNotNull(createdResult.Content);
Assert.AreEqual(1, createdResult.Content.Id);
Asssert.AreEqual(HttpStatusCode.Created, createdResult.StatusCode); // <-- check status