4

我已經採取hints from here爲我的新的Web Api項目提出這個集成測試。我正在嘗試構建一個休息Web服務,並且我有一個計劃發佈給API消費者的幫助客戶端。那是ExampleClientHelper類型。哦,順便說一句,這一切都連接到ValuesController,這是與MVC4 Web Api Visual Studio項目的項目模板一起提供的 - 我將事情簡單化,同時堅持這一點。如何讓自己的主機與IoC進行Web-Api集成測試?

ExampleClientHelper代替上述參考例子中的所有請求/響應。它在內部使用RestSharp

[Test] 
[Ignore] 
public void ValuesHelper_ShouldReturn_value1_And_value2_AsTypedObject() 
{ 
    // IoC prep 
    var builder = new ContainerBuilder(); 
    var container = builder.Build(); 

    // web server prep 
    var baseUri = new Uri("http://localhost:8080"); 
    var config = new HttpSelfHostConfiguration(baseUri); 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

    // yes, the routing needs to be copied over. it's not compatible with the MVC routes 
    config.Routes.MapHttpRoute("Api", "api/{controller}/{id}", 
     new { id = RouteParameter.Optional, namespaces = new[] { typeof(ValuesController).Namespace } }); 

    // start the server and make a request 
    new HttpSelfHostServer(config) 
     .OpenAsync() 
     .ContinueWith(task => 
      { 
       var client = new ExampleClientHelper(baseUri); 
       var values = client.GetValues(); 

       // then test the response 
       Assert.AreEqual("value1", values.ElementAt(0)); 
       Assert.AreEqual("value2", values.ElementAt(1)); 
      }) 
     .Wait(); 
} 

的代碼,只要上述工作正常,你不要修改ValuesController。即。它仍然有一個隱含的無參數構造函數。

我遇到的問題是自我主機服務器似乎無法實例化我的ValuesController當我修改它需要依賴項。問題是,無論是否連接Autofac DependencyResolver,我都會收到來自我的幫助程序客戶端的響應異常。這是在響應返回的內容,很好地格式化爲JSON感謝RestSharp:

{「ExceptionType」:「System.ArgumentException」,「消息」:「類型「Embed.ECSApi.RestServer。在System.Web.Http.Internal.TypeActivator.Create [TBase]中,Controllers.ValuesController'沒有默認構造函數「,」StackTrace「:」System.Linq.Expressions.Expression.New(Type type)\ r \ n「 (類型instanceType)\ r \ n在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage要求,HttpControllerDescriptor controllerDescriptor,類型controllerType)「}

所以很明顯的自我主機服務器試圖創建ValuesController但它不能。爲什麼?我想我正確連接了DependencyResolver。我期待得到一個Autofac異常,而不是抱怨我沒有配置的依賴關係。

+2

請注意,您不應該對自己的主機進行集成測試。使用內存中的主機。這樣你就不再依賴於測試機器,它的端口可用性等了。 http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/ – 2012-07-26 12:19:58

+0

HI Filip。是[這是同一件事](http://www.asp.net/web-api/overview/working-with-http/http-message-handlers)?我一般同意,但是我希望這些集成測試也測試我的幫助者,而我的幫助者提供了一個真正的http請求。我也從集成測試中看到更多的價值,它充當真正的服務器,而不是真正的服務器的「大部分」(這正是內存中方法正在做的)。不同的用例我想。 – 2012-07-27 02:30:05

+0

從某種意義上講,HttpServer只是從HttpMessageHandler派生出來的。有一篇關於http://pfelix.wordpress.com/2012/03/05/asp-net-web-api-in-memory-hosting/的文章。這就是所謂的「俄羅斯娃娃」模式,您可以將無限數量的消息處理程序鏈接到完美的cleint-server對稱中。在內存中,主機的功能與網絡主機或自己的主機完全相同,除非它不會蠶食端口,並且無法從機器外部訪問。它並不是假裝成服務器,而是一個服務器。當然,正如你所說 - 有一切有效的用例 – 2012-07-27 06:46:10

回答

2

看起來您已經忘記將控制器註冊到容器,並且Web API正在嘗試爲您創建實例。

var builder = new ContainerBuilder(); 

// Register API controllers using assembly scanning. 
builder.RegisterApiControllers(typeof(ValuesController).Assembly); 

var container = builder.Build(); 

如果需要,您也可以註冊單獨的控制器。

+0

謝謝。這對我有效。我只是更新了你的答案,所以它在我的例子中的特定情況下工作 - 我的測試是在一個單獨的程序集中,所以'RegisterApiControllers'需要我的控制器的組裝。 – 2012-07-27 03:53:55

相關問題