2016-10-04 17 views
0

ユーザー名とパスワードを認証した後にトークンを発行するOAuthServerProviderがあります。ユーザー名またはパスワードが無効な場合、デフォルトでコンテキストコードとして400 Bad Requestが返されます。NUnit owinミドルウェアをスキップするテストケース

しかし、私はカスタムヘッダが存在しているとあれば、ヘッダをチェックして、表示されるミドルウェアを書かれているこれを達成するために401 Unauthorized

で応答したいので、401

とステータスコードを交換する場合は
if (context.Response.StatusCode == 400 && context.Response.Headers.ContainsKey(Constants.OwinChallengeFlag)) 
{ 
    var headerValues = context.Response.Headers.GetValues(Constants.OwinChallengeFlag); 
    context.Response.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault()); 
    context.Response.Headers.Remove(Constants.OwinChallengeFlag); 
} 

これは、私がフィドラーでヒットしたときにはうまく動作しますが、以下に書いた単体テストは常に400になります。ユニットテストで要求を行うとミドルウェアはスキップされます。

[TestFixture] 
public class UnitTest1 
{ 
    private TestServer _server; 

    [SetUp] 
    public void SetUp() 
    { 
     _server = TestServer.Create<Startup>(); 
    } 

    [Test] 
    public void ShouldReturnUnauthorizedResponse() 
    { 

     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "/token"); 

     //wrong password 
     var requestContent = "grant_type=password&UserName=foo&Password=bar"; 

     request.Content = new StringContent(requestContent, Encoding.UTF8, "application/x-www-form-urlencoded"); 

     var response = _server.HttpClient.SendAsync(request).Result; 

     //This assert fails, but shouldn't 
     Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); 
    } 
} 

ここで間違っていることを知る必要があります。

+0

1)これはユニットテストではない統合テストです。 2)スタートアップコンフィギュレーションと完全なミドルウェアを表示します。 3)応答をバッファリングしてストリームにアクセスできるようにしていますか? – Nkosi

答えて

0

私は最終的に

await _next.Invoke(environment)が犯人だった....それを考え出しました。ミドルウェアに渡された同じ環境の辞書オブジェクトを使用して呼び出すため、contextオブジェクトの変更が単体テストに反映されませんでした。予想通り

次のコードは

public async Task Invoke(IDictionary<string, object> environment) 
{ 
    var context = new OwinContext(environment); 

    var response = context.Response; 

    response.OnSendingHeaders(state => 
    { 
     var resp = (OwinResponse)state; 
     if (resp.StatusCode == 400 && resp.Headers.ContainsKey(Constants.OwinChallengeFlag)) 
     { 
      var headerValues = context.Response.Headers.GetValues(Constants.OwinChallengeFlag); 
      resp.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault()); 
      resp.ReasonPhrase = HttpStatusCode.Unauthorized.ToString(); 
      resp.Headers.Remove(Constants.OwinChallengeFlag); 
     } 
    }, response); 

    await _next.Invoke(context.Environment); 
} 

以外response.OnSendingHeadersが不可欠である内部レスポンスヘッダを修正、改変contextオブジェクトから取得environment変数を渡すから....動作し、これは、ヘッダが前に変更されることを保証します応答ヘッダーがディスパッチされます。

しかし、私はまだ、フィドラーが正しい応答ステータスコードを取得しているかどうか分かりません。

誰かを助けることを願っています。

関連する問題