gpt4 book ai didi

c# - 带有 ExceptionFilterAttribute 的 UnitTest ApiController

转载 作者:太空狗 更新时间:2023-10-30 01:34:14 24 4
gpt4 key购买 nike

我正在尝试对我的 Controller 进行单元测试,其中异常被 ExceptionFilterAttribute 捕获并作为 HttpResponseException 启动。

Controller

[ExceptionFilters] //ExceptionFilterAttribute
public class EleveController : ApiController
{
private IGpiRepository _gpiRepository;

public EleveController(IGpiRepository gpiRepository)
{
_gpiRepository = gpiRepository;
}

[HttpGet]
[Route("{fiche:int}/grouperepere")]
public GroupeRepere GroupeRepere(int fiche) //This What Im trying to test
{
GpiService service = new GpiService(_gpiRepository);
return service.Get(fiche); //Throw an ArgumentNullException when fiche == 0
}
}

异常过滤器

public class ExceptionFilters : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is NotImplementedException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
else if (context.Exception is ArgumentNullException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new StringContent(string.Format("Argument \"{0}\" is null or invalid", ((ArgumentNullException)context.Exception).ParamName)),
ReasonPhrase = "Argument null or invalid"
};
}
}

这是我的测试:

  private IGpiRepository _gpiRepository;
private Mock<ICallApi> _callApi;
private EleveController _controller;

[TestInitialize]
public void Initialize()
{
_callApi = new Mock<ICallApi>();
_gpiRepository = new GpiRepository(_callApi.Object);
_controller = new EleveController(_gpiRepository);
}

[TestMethod]
public void EleveController__GroupeRepere_WithBadFiche_400BadRequest()
{
string noGroupe = "111";
int fiche = 0;
try
{
GroupeRepere gp = _controller.GroupeRepere(fiche);

Assert.Fail();
}
catch (Exception e)
{
Assert.IsTrue(e is HttpResponseException); // not working --> ArgumentNullException
}
}

问题是 e 仍然是一个 ArgumentNullException。当我继续调试时,它甚至没有到达 ExceptionFilter 类

我错过了什么吗?谢谢。

最佳答案

您的测试直接针对 Controller 。 ExceptionFilterAttribute 取决于服务器。(记住:属性是 Metadata)

测试行为的方法是使用 IIS 服务器或 SelfHost Server ,然后在您的测试类中启动服务器并发送请求:

[TestInitialize]
public void Initialize()
{
_callApi = new Mock<ICallApi>();
_gpiRepository = new GpiRepository(_callApi.Object);

//initialize your server
//set _gpiRepository as a dependency and etc..
}
[TestMethod]
public void EleveController__GroupeRepere_WithBadFiche_400BadRequest()
{
//configure the request
var result = client.ExecuteAsGet<GroupeRepere>(<your request>);

Assert.AreEqual(HttpStatusCode.BadRequest,result.StatusCode);
}

在我看来,除非你的 Controller 是 public Api 的一部分,否则你不应该错误代码。(原因很简单,这种测试很容易被破坏,它们很慢而且使用昂贵资源)如果你的 Controller 是一部分public Api 你应该通过你的验收测试来测试它,然后你验证没有任何东西覆盖预期的行为。

如果你还想测试这个行为那么我想为您提供另一种测试方法:

  1. 针对 ExceptionFilters 创建 UT。
  2. 创建一个 UT,验证该方法是否具有 ExceptionFilters 属性

例如:

[TestMethod]
public void GroupeRepere_HasExceptionFiltersAttribute()
{
var attribute = typeof (UnitTest2).GetMethod("GroupeRepere").GetCustomAttributes(true);

foreach (var att in attribute)
{
if(att.GetType() is typeof(ExceptionFilters))
{
return;
}
}
Assert.Fail();
}

优点:它速度快,不易损坏,不使用昂贵的资源。

缺点:在生产中,某些设置可能会覆盖预期的行为。

关于c# - 带有 ExceptionFilterAttribute 的 UnitTest ApiController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31479115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com