C# 测试返回ActionResult的API控制器<;T>;

C# 测试返回ActionResult的API控制器<;T>;,c#,unit-testing,asp.net-core,moq,C#,Unit Testing,Asp.net Core,Moq,测试以下控制器 public class AnnouncementController : Controller { IConfiguration _configuration; IHostingEnvironment _env; ILoggerManager _logger; public AnnouncementController(IConfiguration configuration, IHostingEnvironment env, ILogg

测试以下控制器

public class AnnouncementController : Controller
{

    IConfiguration _configuration;

    IHostingEnvironment _env;

    ILoggerManager _logger;

    public AnnouncementController(IConfiguration configuration, IHostingEnvironment env, ILoggerManager logger)
    {
        _configuration = configuration;
        _env = env;
        _logger = logger;
    }

    [HttpGet ("{employeeID}/{moduleID}")]
    public ActionResult<Announcements> GetAnnouncements([FromRoute]int employeeID, [FromRoute] int moduleID)
    {
       try
       { 
          Services.Interface.IAnnouncementService service = new Services.Imp.AnnouncementService(_configuration, _logger);///establishing new Service connection

           if (service != null)
           {
               Announcements announcements = service.GetAnnouncements(employeeID, moduleID);       

               return announcements;
           }
           else
           {
               return BadRequest("Unable to establish connection.");
          }
      }
      catch (Exception ex)
      {
          _logger.LogError(ex.Message, ex);//log error
        return BadRequest(ex.Message);
      }
    }
}
公共类公告控制器:控制器
{
i配置\u配置;
IHostingEnvironment;
iLogger Manager_记录器;
public AnnouncementController(IConfiguration配置、IHostingEnvironment环境、iLogger管理器记录器)
{
_配置=配置;
_env=env;
_记录器=记录器;
}
[HttpGet(“{employeeID}/{moduleID}”)]
公共操作结果GetAnnounces([FromRoute]int-employeeID,[FromRoute]int-moduleID)
{
尝试
{ 
Services.Interface.IANNounceServiceService=new Services.Imp.AnnouncementService(_配置,_记录器);///建立新的服务连接
if(服务!=null)
{
Announcements=service.GetAnnouncements(employeeID,moduleID);
回报公告;
}
其他的
{
返回错误请求(“无法建立连接”);
}
}
捕获(例外情况除外)
{
_logger.LogError(ex.Message,ex);//日志错误
返回请求(例如消息);
}
}
}
使用以下测试代码:

public void ForSessionActionResult_ReturnsObjectResult()
{
    IConfiguration _configuration;
    IHostingEnvironment _env;
    ILoggerManager _logger;

    var mock_logger = new Mock<ILoggerManager>();
    _logger = mock_logger.Object;
    var mock_configuration = new Mock<IConfiguration>();
    _configuration = mock_configuration.Object;
    var mock_env = new Mock<IHostingEnvironment>();
    _env = mock_env.Object;

    var sut = new AnnouncementController(_configuration, _env, _logger);
    int employeeID = 1;
    int moduleID = 1;
    var result = sut.GetAnnouncements(employeeID, moduleID);

    var actionResult = Assert.IsType<ActionResult<Announcements>>(result);
    Assert.IsType<NotFoundObjectResult>(actionResult.Result);

}
SessionActionResult的公共作废\u ReturnsObjectResult()
{
i配置\u配置;
IHostingEnvironment;
iLogger Manager_记录器;
var mock_logger=new mock();
_logger=mock_logger.Object;
var mock_configuration=new mock();
_配置=mock_configuration.Object;
var mock_env=new mock();
_env=mock_env.Object;
var sut=新的AnnouncementController(_配置,_环境,_记录器);
int employeeID=1;
int moduleID=1;
var result=sut.getannounces(employeeID,moduleID);
var actionResult=Assert.IsType(结果);
IsType(actionResult.Result);
}
我在正在测试的控制器上获得
Assert.IsType NotFoundObjectResult
上的
BadRequestObjectResult

我不确定我是否正确地模拟了控制器构造函数


但是在最后一个断言中,我得到了
BadRequestObjectResult

,我只是想说-您的
IAN服务
应该是一个依赖项,应该通过构造函数注入。也许,应该实际测试这个服务,但不应该测试控制器。此外,您不应该在所有异常情况下返回错误的请求。想象你自己是API的消费者。错误的请求意味着“调用方出错”,但异常意味着“代码中存在意外错误”。InternalServerError(500)在这种情况下更合适。在测试的代码中,没有任何地方返回
NotFoundObjectResult
,但您尝试断言SUT可能返回它不使用的内容。第二,SUT与实现问题紧密耦合(即
AnnouncementService
),这可能导致单独测试SUT时出现问题。在解决当前测试中的问题之前,您应该考虑重构代码。只需说,您的<代码> iRealMeCuthService < /代码>应该是依赖项,并且应该通过构造函数注入。也许,应该实际测试这个服务,但不应该测试控制器。此外,您不应该在所有异常情况下返回错误的请求。想象你自己是API的消费者。错误的请求意味着“调用方出错”,但异常意味着“代码中存在意外错误”。InternalServerError(500)在这种情况下更合适。在测试的代码中,没有任何地方返回
NotFoundObjectResult
,但您尝试断言SUT可能返回它不使用的内容。第二,SUT与实现问题紧密耦合(即
AnnouncementService
),这可能导致单独测试SUT时出现问题。在解决当前测试的问题之前,应考虑重构代码。