簡體   English   中英

我正在為調用內部方法的方法編寫單元測試。 我們如何模擬內部方法?

[英]i am writing the unit test for method inside which calls internal method. how can we mock the internal method?

這是我的代碼

public IActionResult Post([FromBody] ApiPermission apiClient)
    {
        return Ok(_apiPermissionService.Add(apiClient, GetCurrentUserFullName(_httpContextAccessor.HttpContext.User)));
    }

我需要“GetCurrentUserFullName”的結果,其定義為

internal string GetCurrentUserFullName(ClaimsPrincipal principal)
    {
        if (principal == null)
            throw new ArgumentNullException(nameof(principal));

        return principal.FindFirstValue("UserFullName");
    }

我們如何通過 GetCurrentUserFullName 來通過測試。

下面是我的測試代碼

 public void Post()
    {
        Mock<ApiPermissionGroup> mockApiPermissionGroup = new Mock<ApiPermissionGroup>();
        var apiPermission = new ApiPermission
        {
            ApiPermissionId = 1,
            Name = "Name",
            Description = "Description",
            AddedBy = "AddedBy",
            AddedDate = DateTime.UtcNow,
            ModifiedBy = "ModifiedBy",
            ModifiedDate = DateTime.UtcNow,
            ApiPermissionGroupId = 2,
            ApiPermissionGroup = mockApiPermissionGroup.Object
        };
        List<ApiPermission> lstApiPermission = new List<ApiPermission>();
        lstApiPermission.Add(apiPermission);

        ApiPermissionController ApiPermissionController = new ApiPermissionController(_mockApiPermissionService.Object, _mockHttpContextAccessor.Object);

        var result = ApiPermissionController.Post(apiPermission);
        Assert.IsNotNull(result);
    }

運行上述代碼時,我收到錯誤“System.NullReferenceException:Object 引用未設置為 object 的實例。”

Microsoft.AspNetCore.Http.IHttpContextAccessor.HttpContext.get 返回 null。

在這種特定情況下,我不會模擬內部方法,而是模擬上下文訪問器,例如:

// Set up mock principal
var principal = new Mock<ClaimsPrincipal>();
principal.Setup(r => r.FindFirstValue("UserFullName")).Returns("TEST_USER_NAME");
// Create dummy context
var context = new DefaultHttpContext { User = principal.Object };
// Set up mock context accessor
var mockCtxAcc = new Mock<IHttpContextAccessor>();
mockCtxAcc.SetupGet(x => x.HttpContext).Returns(context);
// Create controller under test
var ctrl = new MyController(mockCtxAcc.Object, ...);

單元測試應按原樣測試 class 的行為,但沒有 class 的依賴關系。 這樣,您可以測試 controller 在現實生活場景中運行的代碼 - 也是內部方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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