4

ここからヒントを得て、新しいWebApiプロジェクトのこの統合テストを考え出しました。残りのWebサービスを構築しようとしていますが、APIコンシューマーにリリースする予定のヘルパークライアントがあります。それExampleClientHelperがそこにあるタイプです。ああ、ところで、これはすべてValuesController、MVC4 Web Api Visual Studioプロジェクトのプロジェクトテンプレートで提供されるものにつながります-これを理解している間、私は物事を単純に保ちます。

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を接続するかどうかに関係なく、ヘルパークライアントからの応答から同じ例外が発生することです。これは、応答のコンテンツで返されるものであり、RestSharpのおかげでJSONとして適切にフォーマットされています。

{"ExceptionType": "System.ArgumentException"、 "Message": "Type'Embed.ECSApi.RestServer.Controllers.ValuesController'にはデフォルトのコンストラクターがありません"、 "StackTrace":"atSystem.Linq.Expressions.Expression。 New(Type type)\ r \ n at System.Web.Http.Internal.TypeActivator.Create [TBase](Type instanceType)\ r \ n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor 、Type controllerType) "}

したがって、明らかにセルフホストサーバーは作成しようとしていますValuesControllerが、作成できません。なんで?DependencyResolverを正しく配線したと思いました。代わりに、構成していない依存関係について文句を言うAutofac例外が発生することを期待しています。

4

1 に答える 1

2

コントローラーをコンテナーに登録するのを忘れていて、Web API がインスタンスを作成しようとしているようです。

var builder = new ContainerBuilder();

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

var container = builder.Build();

必要に応じて、個々のコントローラーを登録することもできます。

于 2012-07-26T11:59:39.277 に答える