我已經採取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異常,而不是抱怨我沒有配置的依賴關係。
請注意,您不應該對自己的主機進行集成測試。使用內存中的主機。這樣你就不再依賴於測試機器,它的端口可用性等了。 http://www.strathweb.com/2012/06/asp-net-web-api-integration-testing-with-in-memory-hosting/ – 2012-07-26 12:19:58
HI Filip。是[這是同一件事](http://www.asp.net/web-api/overview/working-with-http/http-message-handlers)?我一般同意,但是我希望這些集成測試也測試我的幫助者,而我的幫助者提供了一個真正的http請求。我也從集成測試中看到更多的價值,它充當真正的服務器,而不是真正的服務器的「大部分」(這正是內存中方法正在做的)。不同的用例我想。 – 2012-07-27 02:30:05
從某種意義上講,HttpServer只是從HttpMessageHandler派生出來的。有一篇關於http://pfelix.wordpress.com/2012/03/05/asp-net-web-api-in-memory-hosting/的文章。這就是所謂的「俄羅斯娃娃」模式,您可以將無限數量的消息處理程序鏈接到完美的cleint-server對稱中。在內存中,主機的功能與網絡主機或自己的主機完全相同,除非它不會蠶食端口,並且無法從機器外部訪問。它並不是假裝成服務器,而是一個服務器。當然,正如你所說 - 有一切有效的用例 – 2012-07-27 06:46:10