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