4

OpenRastaプロジェクト(http Webサービス上のxml)の作業を開始しようとしています。OpenRastaは見栄えがしますが、残念ながら機能する例はインターネット上ではほとんどないようです。プロジェクトのテスト側を見ると、ハンドラーが強く型付けされたオブジェクト(OperationResultではない)を返している場合、つまり次のようになります。

public class PersonHandler
...
 public Person Get(int id)
 {
 ...

httpステータスコードをテストするにはどうすればよいですか?(たとえば、ハンドラーがキャッチされない例外をスローした場合)。テストがどのレベルでピッチインするのか、そして何をモックする必要があるのか​​わかりません(moq btwを使用)

特にコード化された例など、助けていただければ幸いです。

4

2 に答える 2

1

ハンドラーは、理想的には最小限の依存関係を持つ単なるクラスであるため、単体テストはクラス内の分離されたロジックをテストするだけで済みます。

ステータス コードをテストする場合は、OpenRasta セルフ ホスティングを使用することをお勧めします (ほとんど経験がありません!)。

これは私が最近書いたテストです(多少変更されています):

    [TestMethod]
    public void POST_with_inaccurate_contentLength_returns_405()
    {
        var resource = GetResource();

        IRequest request = new InMemoryRequest
        {
            HttpMethod = "POST",
            Uri = new Uri("http://localhost/Resource"),
        };
        request.Headers.ContentLength = 16;  //wrong!

        request.Entity.Stream.Write(resource.Content, 0, resource.Content.Length);

        var response = _host.ProcessRequest(request);

        Assert.AreEqual(405, response.StatusCode);
    }

ホストが TestInitialize メソッドで次のように設定されていることを追加する必要があります。

        _host = new InMemoryHost(new Configuration());
        _host.Resolver.AddDependencyInstance(typeof(IFileResourceRepository), _repository, DependencyLifetime.Singleton);

...そして、TestCleanup メソッドでクリーンアップされます。

于 2012-03-28T02:24:22.217 に答える
1

私は同じ問題に直面し、実際には単純な HttpWebRequest クライアントを介して実際の REST/HTTP 呼び出しを行い、はるかに高いレベルで統合テストとしてテストを作成することになりました。これにより、HTTP 応答ヘッダー/ステータス コードを確認し、クライアントの観点から JSON/XML シリアル化を再確認することができました。これは、操作が成功したかどうかと同じくらい重要でした。

すべてのハンドラーから OperationResult を返すことから始め、これらを使用して厳密に型指定されたオブジェクトをラップしました。私のハンドラーはすべて、ユーザー フレンドリなエラー メッセージでカスタム エラーを返しやすくするいくつかのヘルパー メソッドを含む基本クラスから継承します。これをコーディングすればするほど、ハンドラーは ASP.NET MVC コントローラーに似てきました。例えば:

    public OperationResult GetById(int id)
    {
        try
        {
            // do stuff here
            return OKResult( // some strongly-typed resource );
        }
        catch(SomeException ex)
        {
            return BadRequestResult(SomeErrorCode, ex.Message);
        }
    }

次に、テスト クライアントで HTTP ステータス コードを確認するのは非常に簡単です。明らかに、これは嘲笑にはあまり役に立ちません。実際、誰かが私よりもうまく答えてくれることを期待して、この質問をお気に入りにしましたが、これはこれまでのところかなりうまくいきました。

于 2010-10-26T16:19:42.147 に答える