1

単体テストの際、csv形式の結果を確認したいので、テストに以下のコードを入れています。

MyDtoReq request = new MyDtoReq();
// ... assign some properties
string url = request.ToUrl("GET");
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(url);
httpReq.Accept = "text/csv";
csv = new StreamReader(httpReq.GetResponse().GetResponseStream()).ReadToEnd();

リクエストが成功した場合、それはうまくいきます。しかし、失敗するとSystem.Net.WebException、期待される詳細を持たない が発生しWebServiceException.ResponseStatusます。NUnit は次のように例外を報告します。

Test Name:  TestReq
Test FullName:  [...].TestReq
Test Source:    c:\Users\[...]\UnitTestProject1\ServiceTests.cs : line 261
Test Outcome:   Failed
Test Duration:  0:00:27.104

Result Message: System.Net.WebException : The remote server returned an error: (400) Bad Request.
Result StackTrace:  at [...].TestReq() in c:\Users\[...]\UnitTestProject1\ServiceTests.cs:line 287

csv 形式を要求するほとんどのクライアントはResponseStatus. 実際のエラーを確認するために、ブラウザで format=html を指定してリクエストを再送信しますが、時間の無駄です。

4

1 に答える 1

1

失敗した csv 形式の要求から実際のエラー メッセージを取得する方法は次のとおりです。

// Declared in test setup
public const string Host = "http://localhost:1337";
private const string BaseUri = Host + "/";

[Test]
public void TestMyDtoReqCsvFormat()
{
    MyDtoReq request = new MyDtoReq();
    request.startDate = "20130919";
    request.endDate = "20130930";
    request.source = "Token";

    try
    {
        string requestUrl = request.ToUrl("GET");
        HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(requestUrl);
        httpReq.Accept = "text/csv";
        var csv = new StreamReader(httpReq.GetResponse().GetResponseStream()).ReadToEnd();
        // assert some facts about the contents of csv
    }
    catch (Exception)
    {
        try {
            JsonServiceClient client = new JsonServiceClient(BaseUri);
            MyDtoReqResponse response = client.Get(request);
            // do something if re-request succeeds (i.e. was a transient error)
        }
        catch (WebServiceException webEx) 
        {
            var message = webEx.ResponseStatus.ErrorCode +
                " " + webEx.ResponseStatus.Message.Trim() +
                " " + webEx.ResponseStatus.StackTrace.Trim();
            throw new WebException(message,webEx);
        }
        catch (Exception otherEx) {
            System.Diagnostics.Debug.WriteLine(otherEx.Message);
            throw new Exception(otherEx.Message, otherEx);
        }
    }
}
于 2013-10-01T16:52:38.383 に答える