Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试Web API IHttpActionResponse状态代码_C#_Unit Testing_Asp.net Web Api2_Moq_Mstest - Fatal编程技术网

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