2013-12-20 17 views
8

私はテストで働く命令コードのセットを持っています。私はそれを必須のテスト規約に煮詰めようとしています。はApiControllersのための規約を作成する必要があります

私のテストは、次のようになります。私も、これはすなわち非null値をデフォルトにHttpConfigurationHttpRequestMessageを設定することにより、動作することができますカスタマイズを持って

[Theory, BasicConventions] 
public void GetVersionOnSiteVersionControllerReturnsASiteVersion(IFixture fixture) 
{ 
    fixture.OmitAutoProperties = true; 
    SiteVersion expected = fixture.Create<SiteVersion>(); 
    SiteVersion actual = null; 

    var sut = fixture.Create<SiteVersionController>(); 

    var response = sut 
     .GetSiteVersion() 
     .ExecuteAsync(new CancellationToken()) 
     .Result 
     .TryGetContentValue<SiteVersion>(out actual); 

    actual.AsSource().OfLikeness<SiteVersion>().ShouldEqual(expected); 
} 

public class ApiControllerCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     var origin = fixture.OmitAutoProperties; 
     fixture.OmitAutoProperties = true; 
     var sut = fixture.Create<SiteVersionController>(); 
     sut.Configuration = fixture.Create<HttpConfiguration>(); 
     sut.Request = fixture.Create<HttpRequestMessage>(); 
     fixture.Inject<SiteVersionController>(sut); 
     fixture.OmitAutoProperties = origin; 
    } 
} 

まず、これは醜いが、私は<を構築し使用する場合は、>()。(省略)。(設定).with(リクエスト)と、それはそれらのインスタンスを構築するために必要automoqのカスタマイズを遮断。

第2に、これはSiteVersionControllerでのみ機能します。私はむしろすべての私のApiControllers(これは悪い考えですが、私は試してみるまでわからない)のためにこれを一般化するだろう。すべてApiControllersため を、自動プロパティなしでそれらを作成するが、非null値

+0

どのような 'ApiController'タイプで作業していますか? ASP.NET Web API?どのバージョン? –

+1

私のNuGetパッケージマネージャーは、ASP.NET Web APIバージョン5.0.0と答えています。 – cocogorilla

+1

関連:http://stackoverflow.com/q/19908385/126014 –

答えて

7

ApiControllersがワイヤーに非常に困難なデフォルトにHTTP構成と要求メッセージのプロパティを設定します:

基本的に私の規則では、次のようになりますなぜなら、すべてが機能するためには、特定のプロパティを割り当てる必要があるからです。少なくともRequestプロパティを割り当てる必要があります。それ以外の場合はControllerRequest.CreateResponseを呼び出せないためです。したがって、ApiControllerインスタンスの自動プロパティをオフに切り替えるのは良い方法ではありません。代わりに、HttpRequestMessageのインスタンスを正しく接続するようにAutoFixtureを構成することができます。

ASP.NETのWeb API 1でWeb APIを1

は、私は通常、このようにカスタマイズを使用する:自動プロパティは、デフォルトでオンになっているので

public class WebApiCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Customize<HttpRequestMessage>(c => c 
      .Do(x => 
       x.Properties.Add(
        HttpPropertyKeys.HttpConfigurationKey, 
        new HttpConfiguration()))); 
    } 
} 

、これは割り当てるために起こっていますHttpRequestMessageApiController.Requestの適切なインスタンス。 Auto-mockingカスタマイズと一緒に、FixtureはすべてのApiControllerクラスのインスタンスを作成できるようになりました。 ASP.NETのWeb API 2(5.0.0.0)で

ウェブAPI 2

、物事はもう少し複雑ですが、試行錯誤のビットで、私は808回の試験に合格するために、このカスタマイズを得ました:

public class WebApiCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Customize<HttpConfiguration>(c => c 
      .OmitAutoProperties()); 
     fixture.Customize<HttpRequestMessage>(c => c 
      .Do(x => 
       x.Properties.Add(
        HttpPropertyKeys.HttpConfigurationKey, 
        fixture.Create<HttpConfiguration>()))); 
     fixture.Customize<HttpRequestContext>(c => c 
      .Without(x => x.ClientCertificate)); 
    } 
} 

表記

あなたは[AutoData]属性にそれをパッケージ化した場合、あなたはあなたのテストをリファクタリングすることができるはずです:

[Theory, BasicConventions] 
public void GetVersionOnSiteVersionControllerReturnsASiteVersion(
    SiteVersionController sut, 
    SiteVersion expected) 
{ 
    SiteVersion actual = null; 

    var response = sut 
     .GetSiteVersion() 
     .ExecuteAsync(new CancellationToken()) 
     .Result 
     .TryGetContentValue<SiteVersion>(out actual); 

    actual.AsSource().OfLikeness<SiteVersion>().ShouldEqual(expected); 
} 
+1

これは素晴らしいです。質問、ありがたいことに、私はAutoFixtureのハングアップを取得しています、私のハングアップのほとんどは、このようなものを配線しようとしています。これを研究する戦略はどうやって行くのですか?または単に経験ですか? – cocogorilla

+7

まあ、個人的に、私は* AutoFixtureを書いていますので、私は不正行為だと言うこともできます:)私はこの質問にも他人に答えてもらうように勧めます。 –

+1

F#のASP.NET Web API 2のカスタマイズは、https://gist.github.com/moodmosaic/2789ba06980880217df7にあります。 –

関連する問題