2016-04-04 5 views
1

私は、Azure Mobile App .Net Serverの権限で私のapiコントローラをユニットテストしようとしています。ユニットテストAzure Mobile .NETコントローラ(許可付き)

は私のコントローラメソッドは次のようになります。私はこのようなユニットテストの方法で私の要求を構成し

[Authorize] 
public HttpResponseMessage SomeMethod() 
{ 
    var claimsPrincipal = this.User as ClaimsPrincipal; 
    string userId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value; 
    return Request.CreateResponse(HttpStatusCode.OK, userId); 
} 

[TestMethod] 
public void SomeMyAPIControllerTest(){ 
    var config = new HttpConfiguration(); 
    var request = new HttpRequestMessage(); 
    request.RequestUri = new Uri("http://localhost:50268/api/MyAPI"); 
    request.Headers.Add("x-zumo-auth", "_user_auth_token_"); 
    request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 
    var controller = new MyAPIController(TestContext) 
    { 
     Request = request 
    }; 
    var response = controller.SomeMethod(); 
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
} 

私のコントローラメソッドは、ローカルホスト上の闊歩を経て正常に動作しますが、ユニットテストの方法を経由してそれは動作しません。 認証済みのユーザー情報を取得しようとすると、が返されます。null

私はリクエスト構成に間違いがあります。助言がありますか?

答えて

1

UserApiControllerに直接設定することができます。

テストメソッドを更新して、コントローラの偽ユーザーを作成します。

[TestMethod] 
public void SomeMyAPIControllerTest(){ 
    // Arrange 
    var config = new HttpConfiguration(); 
    var request = new HttpRequestMessage(); 
    request.RequestUri = new Uri("http://localhost:50268/api/MyAPI"); 
    request.Headers.Add("x-zumo-auth", "_user_auth_token_"); 
    request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 
    //Create test user 
    var username = "[email protected]"; 
    var identity = new GenericIdentity(username, ""); 
    //Add fake claim for test 
    var nameIdentifierClaim = new Claim(ClaimTypes.NameIdentifier, username); 
    identity.AddClaim(nameIdentifierClaim); 
    var principal = new GenericPrincipal(identity, roles: new string[] { }); 
    var user = new ClaimsPrincipal(principal); 
    // Set the User on the controller directly 
    var controller = new MyAPIController(TestContext) 
    { 
     Configuration = config, 
     Request = request, 
     User = user 
    }; 

    //Act 
    var response = controller.SomeMethod(); 

    //Assert 
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
} 
+0

、@Nkosi、ありがとうございました。私の例では、 "identity/claims/name:[email protected]"を得ることができますが、 "identity/claims/nameidentifier"型を追加する方法はありますか? – deman4ik

+0

@ deman4ikあなたがリクエストした情報を含めるように答えを更新しました。あなたがこの質問を助けてくれたら助かります。これが実際にあなたの問題を解決するのであれば、答えとしてマークすることを忘れないでください。ありがとう – Nkosi

+0

はい、まさに私が望んでいた!ありがとうございました! – deman4ik

関連する問題