2013-12-20 11 views
8

我在測試中有一套工作命令式的代碼,我試圖將它歸結爲基本的測試慣例。需要爲ApiControllers創建約定

我的測試如下所示:

[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); 
} 

我也有一個自定義,讓這項工作,即通過設置HttpConfigurationHttpRequestMessage爲默認爲非空值。

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; 
    } 
} 

首先,這個相貌醜陋,但如果我用建立<>()。省略()與(配置)。隨着(請求),它會關閉它需要建立的情況下,automoq定製。

其次,這隻適用於SiteVersionController。我寧願把它推廣到所有我的ApiControllers(也許這是一個壞主意,但我不會知道,直到我嘗試)。

本質上我的約定將如下所示: 所有ApiControllers,沒有自動屬性創建它們,但不要設置http配置和請求消息的屬性爲默認爲非空值

+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是線相當困難因爲你需要給它們分配一些屬性才能使所有的東西都起作用。至少,您需要分配Request屬性,因爲否則,Controller無法調用Request.CreateResponse。因此,關閉ApiController實例的自動屬性不是一個好策略。相反,您可以配置AutoFixture以正確連接HttpRequestMessage實例。

的Web API 1

用的ASP.NET 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現在可以創建所有類的實例。

的Web API 2

用的ASP.NET Web API 2(5.0.0.0),事情有點複雜,但有一點試驗和錯誤,我得到這個定製通過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的懸念,我的大多數hangups都試圖將這樣的東西連接起來。你怎麼去研究這個,一個策略?或只是經驗? – cocogorilla

+7

好吧,我親自寫了* AutoFixture,所以你可以說我在作弊:)我也邀請其他人回答這個問題。 –

+1

F#中ASP.NET Web API 2的相同定製可在以下位置找到:https://gist.github.com/moodmosaic/2789ba06980880217df7 –