26

ApiControllerの単体テストでは、いくつかのヘルパーメソッドを使用してコントローラーをインスタンス化します。

public static ResourcesController SetupResourcesController(HttpRequestMessage request, IResourceMetadataRepository repo, IUnitOfWorkService unitOfWorkService)
{
    var config = new HttpConfiguration();
    var defaultRoute = config.Routes.MapHttpRoute(RouteNames.DefaultApi , "api/{controller}/{id}");
    var routeData = new HttpRouteData(defaultRoute, new HttpRouteValueDictionary { { "controller", "resources" } });

    var resourcesController = new ResourcesController(repo, unitOfWorkService)
    {
        ControllerContext = new HttpControllerContext(config, routeData, request),
        Request = request
    };
    resourcesController.Request.Properties.Add(HttpPropertyKeys.HttpRouteDataKey, routeData);
    resourcesController.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

    // Compilation fail: The Property 'System.Web.Http.ApiController.User' has no setter.
    resourcesController.User = myStubUserPrincipal;

    return resourcesController;
}

私の質問は、コントローラーのUserプロパティを設定する方法です。

私はもう試した:

request.Properties.Add("MS_UserPrincipal", myStubUserPrincipal);

ただし、これも機能しません(resourcesController.Userプロパティはnullのままです)。

4

2 に答える 2

37

を設定すると、コントローラーのプロパティが自動的にThread.CurrentPrincipal初期化されます。User

この回答は表示されているが、設定方法がわからない場合CurrentPrincipalこのコードはMSDNから抽出されたものです。

Thread.CurrentPrincipal = new GenericPrincipal
(
   new GenericIdentity("Bob", "Passport"),
   new[] {"managers", "executives"}
);
于 2013-03-15T15:25:46.897 に答える
13

よりクリーンな方法は、モックを作成しIPrincipalHttpRequestContext、たとえばMoqを使用することです。

var userMock = new Mock<IPrincipal>();
userMock.Setup(p => p.IsInRole("admin")).Returns(true);
userMock.SetupGet(p => p.Identity.Name).Returns("tester");
userMock.SetupGet(p => p.Identity.IsAuthenticated).Returns(true);

var requestContext = new Mock<HttpRequestContext>();
requestContext.Setup(x => x.Principal).Returns(userMock.Object);

var controller = new ControllerToTest()
{
    RequestContext = requestContext.Object,
    Request = new HttpRequestMessage(),
    Configuration = new HttpConfiguration()
};
于 2016-08-01T14:00:19.340 に答える