Ninjectを使用してWebAPIプロジェクトを設定し、最新バージョンのWeb APIで動作させるために、ここで詳しく説明する修正を使用しました。すべてが正常に機能していますが、現在、いくつかのテストを作成しようとしています。
ここで詳しく説明するように、メモリ内ホスティングを使用してテスト用のプロジェクトを実行しています。DelegatingHandler
これは、認証を実行し、すべてのApiコントローラーで使用される要求メッセージにプロパティを設定するためです。
したがって、テスト用の基本クラスがあり、作業中のNinjectコードからほとんど取得した構成と構成SetUp
をセットアップするメソッドがHttpServer
あります。
[SetUp]
public void Setup()
{
bootstrapper = new Bootstrapper();
DynamicModuleUtility.RegisterModule(
typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(
typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
var config = new HttpConfiguration();
config.Routes.MapHttpRoute("Login",
"api/auth/token",
new { controller = "Users", action = "Login" });
config.IncludeErrorDetailPolicy =
IncludeErrorDetailPolicy.Always;
config.DependencyResolver =
new NinjectResolver(CreateKernel());
config.MessageHandlers.Add(
new AuthenticationHandler(CreateUserManager()));
Server = new HttpServer(config);
}
これが私が作成する方法ですMoqMockingKernel
:
private static IKernel CreateKernel()
{
var kernel = new MoqMockingKernel();
kernel.Bind<Func<IKernel>>()
.ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>()
.To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
GlobalConfiguration.Configuration.DependencyResolver =
new NinjectResolver(kernel);
return kernel;
}
そして、これは私が使用するオブジェクトを登録する方法です:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUserManager>().ToMock();
kernel.Bind<UsersController>().ToSelf();
}
私はコントローラー自体をテストしていませんが、コントローラーの適切なインスタンスを呼び出したいので、ToSelfにバインドしています。私はこれが正しいと仮定していることを認めなければなりません。これはテストの例です:
public void UserCannotLogin()
{
System.Net.Http.HttpClient client =
new System.Net.Http.HttpClient(Server);
string json = string.Format(
"{{ \"Username\": \"{0}\", \"Password\": \"{1}\" }}",
"wrong", "wrong");
HttpRequestMessage request =
CreateRequest(@"api/auth/token", json, HttpMethod.Get);
Action action = () => client.SendAsync(request);
using (var response = client.SendAsync(request).Result)
{
response.StatusCode.Should()
.Be(HttpStatusCode.Unauthorized);
}
}
基本的に404エラーが発生します。私がそれをデバッグするとき、それは私のに行きますDelegatingHandler
、しかしそれは私のコントローラーに行きません。
私はここで根本的にポイントを逃しているように感じます、そして私がやろうとしていることをすることさえできないかもしれません、しかし誰かがこれをする方法または達成するための別の方法のいずれかについて何か提案があれば同じこと、私はすべての耳です。
更新MockingKernel
特に指定がない限り、のデフォルトの動作はモックを提供することであるためだと思います。そのため、のモックが返されIHttpControllerSelector
ます。私は今、いくつかのデフォルトのものを設定しました:
kernel.Bind<IHttpControllerSelector>()
.To<DefaultHttpControllerSelector>();
kernel.Bind<IContentNegotiator>()
.To<DefaultContentNegotiator>();
フォーマッターが指定されていないため、まだ機能していないと思います。私は明日それを試して、それが私をそこに連れて行くかどうか確かめます。