![](/img/trans.png)
[英]How to create a unit test for an IActionResult controller action which returns decimal?
[英]Controller returns a null IActionResult when running xUnit test
我在通過單元測試時遇到了一些困難。
這是我的單元測試 class:
[Collection(nameof(VehicleControllerCollection))]
public class DetectVin
{
private readonly VehicleControllerFixture _controllerFixture;
public DetectVin(VehicleControllerFixture controllerFixture)
{
_controllerFixture = controllerFixture;
}
[Fact]
public async Task ReturnsBadRequestGivenPictureIsNull()
{
var controllerMock = _controllerFixture.VehicleController;
controllerMock.Protected().Setup<bool>("HasAnyLicenseClaims", ItExpr.IsAny<string[]>()).Returns(true);
var result = await controllerMock.Object.DetectVin(null, 1) as BadRequestResult;
result.Should().NotBeNull();
}
}
它使用如下所示的CollectionFixture
:
public class VehicleControllerFixture
{
public Mock<v1.v1._0.Vehicle.VehicleController> VehicleController { get; set; }
public VehicleControllerFixture()
{
var vehicleServiceMock = new Mock<IVehicleService>();
VehicleController = new Mock<v1.v1._0.Vehicle.VehicleController>(vehicleServiceMock.Object);
}
}
[CollectionDefinition(nameof(VehicleControllerCollection))]
public class VehicleControllerCollection : ICollectionFixture<VehicleControllerFixture>
{
}
正在測試DetectVin
的方法如下所示:
[RequestSizeLimit(5242880)]
[HttpPost]
public async Task<IActionResult> DetectVin([FromBody]string picture, [FromQuery]int activityId)
{
if (!HasAnyLicenseClaims("ModuleMyWorkshopHGSService", "ModuleMyWorkshopToyotaService")) { return NotAllowed(); }
if (string.IsNullOrWhiteSpace(picture))
{
return BadRequest();
}
var result = await _vehicleService.DetectVin(picture);
if (string.IsNullOrWhiteSpace(result))
{
return UnprocessableEntity();
}
var activityVinDetection = new ActivityVinDetection
{
ActivityId = activityId,
UsedOnActivity = false,
Vin = result
};
_vehicleService.InsertActivityVinDetection(activityVinDetection);
return Ok(result);
}
我的問題是DetectVin
方法總是返回null
。 即使我可以很好地調試測試並單步執行該方法,看到它實際上返回BadRequest()
也是如此。
任何人都知道為什么會這樣?
編輯:
這是VehicleController
繼承自的基數 controller:
public abstract class AIdpClaimsAuthController : BaseController, IAuthorizedController
{
public int WorkshopId
{
get
{
var wid = User.Claims.SingleOrDefault(sd => sd.Type == "sub");
if (wid == null || !int.TryParse(wid.Value, out int workshopId))
{
throw new System.Security.Authentication.AuthenticationException("Unauthorized");
}
return workshopId;
}
}
protected virtual bool HasAnyLicenseClaims(params string[] licenseClaims)
{
foreach (var claim in licenseClaims)
{
if (AuthorizationService.HasLicenseClaims(WorkshopId, claim))
{
return true;
}
}
return false;
}
}
這是AIdpClaimsAuthController
繼承自的基數 controller:
public abstract class BaseController : Controller
{
private IAuthorizationService __authorizationService;
public IAuthorizationService AuthorizationService
{
get
{
if (__authorizationService == null)
{
__authorizationService = this.HttpContext.RequestServices.GetService(typeof(IAuthorizationService)) as IAuthorizationService;
}
return __authorizationService;
}
}
}
使用MockBehaviour.Strict
找到解決方案。 事實證明,我還需要模擬 controller 為BadRequest
方法生成的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.