簡體   English   中英

Controller 在運行 xUnit 測試時返回 null IActionResult

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM