C#、ASP.NET Core MVCでユニットテストを作成しています。MoqのSetupで引数を2つ指定すると、正しくSetupをしてくれない場合があり、困っています。
どなたかご教授お願いします。
わかっていることとしては、
①Contollerの引数をListで渡す時
this._userCheckService.IsCheckedAsyncの引数が
1つの時はtrueを返していた。2つの時にfalseになっていました。
②Contollerの引数を単一データで渡す時
this._userCheckService.IsCheckedAsyncの引数が2つでも、問題なくtrueになりました。
①の作り方をした時のみ、現象が発生しています。
(追記)
開発環境: Windows10 Pro, Visual Studio Professional 2019, .NET 5
C#
1using ApplicationService; 2using DomainModel; 3using DomainService; 4using Microsoft.AspNetCore.Http; 5using Microsoft.AspNetCore.Mvc; 6using Microsoft.Extensions.Logging; 7using Moq; 8using System; 9using System.Collections.Generic; 10using System.Linq; 11using System.Security.Claims; 12using System.Threading.Tasks; 13using UserInterface.Controllers; 14using Xunit; 15 16namespace Test.Controllers.Transaction { 17 18 public class TestsControllerTest : Controller { 19 private Mock<ILogger<TestsController>> _loggerMock = null; 20 private Mock<IUserCheckService> _userCheckServiceMock = null; 21 22 private ClaimsPrincipal _user = null; 23 private TestsController _controller = null; 24 25 public TestsControllerTest() { 26 this._loggerMock = new Mock<ILogger<TestsController>>(); 27 this._userCheckServiceMock = new Mock<IUserCheckService>(); 28 29 this._user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] { 30 new Claim(ClaimTypes.Name, "Administrator"), 31 new Claim(ClaimTypes.Role, "Administrator") 32 }, "mock")); 33 34 // この場合はtrueを返す 35 // this._userCheckServiceMock.Setup(e => e.IsCheckedAsync(this._user)).ReturnsAsync(true); 36 37 // この方法だとうまくいかなかった 38 this._userCheckServiceMock.Setup(e => e.IsCheckedAsync(this._user, null)).ReturnsAsync(true); 39 40 this._controller = new TestsController( 41 this._loggerMock.Object, 42 this._userCheckServiceMock.Object 43 ); 44 45 this._controller.ControllerContext = new ControllerContext() { 46 HttpContext = new DefaultHttpContext() { User = this._user } 47 }; 48 } 49 50 [Fact] 51 public async Task<int> RegisterAsync() { 52 // 適当にnullにしています。 53 var result = await this._controller.Register(null); 54 55 return 1; 56 } 57 } 58}
C#
1using Microsoft.AspNetCore.Authorization; 2using Microsoft.AspNetCore.Mvc; 3using Microsoft.AspNetCore.Http; 4using Microsoft.Extensions.Logging; 5using System; 6using System.Collections.Generic; 7using System.Linq; 8using System.Net; 9using System.Threading.Tasks; 10using ApplicationService; 11using DomainModel; 12using DomainService; 13using System.Security.Claims; 14using Microsoft.AspNetCore.Identity; 15 16namespace UserInterface.Controllers { 17 public class TestsController : Controller { 18 private readonly ILogger<TestsController> _logger; 19 private readonly IUserCheckService _userCheckService; 20 21 public TestsController(ILogger<TestsController> logger, IUserCheckService userCheckService) { 22 this._logger = logger; 23 this._userCheckService = userCheckService; 24 } 25 26 // 説明のため属性は省略しています。 27 public async Task<IActionResult> Register(IList<Test> tests) { 28 // ①Contollerの引数をListで渡す時 29 // this._userCheckService.IsCheckedAsyncの引数が 30 // 1つの時はtrueを返していた。 31 // 2つの時にfalseになってしまう。 32 33 // true 34 bool isCheckedUser1 = Task.FromResult(await this._userCheckService.IsCheckedAsync(this.User)).Result; 35 36 // false 37 bool isCheckedUser2 = Task.FromResult(await this._userCheckService.IsCheckedAsync(this.User, null)).Result; 38 39 // ②Contollerの引数を単一データで渡す時 40 // this._userCheckService.IsCheckedAsyncの引数が2つでも、trueになりました。 41 } 42 } 43}
C#
1using System; 2using System.Security.Claims; 3using System.Threading.Tasks; 4using DomainModel; 5 6namespace DomainService { 7 public interface IUserCheckService { 8 Task<bool> IsCheckedAsync(ClaimsPrincipal user); 9 Task<bool> IsCheckedAsync(ClaimsPrincipal user, Project project); 10 } 11}
回答1件
あなたの回答
tips
プレビュー