2016-06-21 9 views
9
次のコードは、期待どおりに動作し、ASPサイトに掲載されていたサンプルには本当に似ている

動作しません。コントローラは問題ありません。しかし、実生活では、テストはもう少し複雑で、サービスやカスタムテストの設定を追加する必要があります。私は私の元のプロジェクトのスタートアップクラスから継承してTestStartupを作成し、これを行うためには.NETのコアRC2非自明な統合テストは

:あなたは今、私は私を使用するためにビルダーを変更、基本クラスへの唯一の代表者にそれを見ることができるように

public class TestStartup : Startup 
{ 
    public TestStartup(IHostingEnvironment env) : base(env) 
    { 
    } 

    public override void ConfigureServices(IServiceCollection services) 
    { 
     base.ConfigureServices(services); 
    } 

    public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     base.Configure(app, env, loggerFactory); 
    } 
} 

TestStartupコード:

protected BaseResourceTests(string resourceVersion) 
    { 
     var hostBulider = new WebHostBuilder() 
      .UseStartup<TestStartup>(); 

     _server = new TestServer(hostBulider); 

     HttpClient = _server.CreateClient(); 
     HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(resourceVersion)); 
     HttpClient.BaseAddress = new Uri("http://localhost:5000"); 
    } 

これで、Http NotFound例外でテストが失敗するようになりました。デバッグすると、コントローラ内のアクションがテストコードにヒットしなくなったことがわかります。

私の推測では、スタートアップファイルがコントローラと異なるコントローラであれば、何とかmvcがルートを検出しないと思いますが、どうすればこの問題を回避できますか?

+0

'_server = new TestServer(hostBulider);'に変更してください。 _server = TestServer.CreateBuilder()。UseStartup (); – Set

+0

TestServerクラスに静的メソッドCreateBuilderはありません。私は以前はrc1にあったと思います – Calin

答えて

1

xUnitとのこの種の統合テストを投稿した投稿はhttp://andrewlock.net/introduction-to-integration-testing-with-xunit-and-testserver-in-asp-net-coreです。私が撮った


アプローチは、あなたのテストクラスに注入することができるFixtureクラスを作成することでした。

フィクス:

public class TestFixture<TStartup> : IDisposable where TStartup : class 
{ 
    private readonly TestServer _server; 

    public TestFixture() 
    { 
     var builder = new WebHostBuilder().UseStartup<TStartup>(); 
     _server = new TestServer(builder); 

     Client = _server.CreateClient(); 
     Client.BaseAddress = new Uri("http://localhost:5000"); 
    } 

    public HttpClient Client { get; } 

    public void Dispose() 
    { 
     Client.Dispose(); 
     _server.Dispose(); 
    } 
} 

テストクラスは、その後IClassFixture<TestFixture<TStartup>>を実装しています

public class MiddlewareIntegrationTests : IClassFixture<TestFixture<SystemUnderTest.Startup>> 
{ 
    public MiddlewareIntegrationTests(TestFixture<SystemUnderTest.Startup> fixture) 
    { 
     Client = fixture.Client; 
    } 

    public HttpClient Client { get; } 

    [Fact] 
    public async Task AllMethods_RemovesServerHeader(string method) 
    { 
     // Arrange 
     var request = new HttpRequestMessage(new HttpMethod("GET"), "/"); 

     // Act 
     var response = await Client.SendAsync(request); 

     //assert etc 
    } 
} 

MVCを使用して、あなたの意見を発見することができます確保するためには、設定するためにあなたのWebHostBuilderを更新する必要がありますコンテンツパス:

var path = PlatformServices.Default.Application.ApplicationBasePath; 
var setDir = Path.GetFullPath(Path.Combine(path, <projectpathdirectory>)); 

var builder = new WebHostBuilder() 
    .UseContentRoot(setDir) 
    .UseStartup<TStartup>(); 
+0

ありがとう、実際に質問を投稿する前にあなたのブログ記事を読んだことがあります。すぐにこれを証明するためのレポ。 – Calin

0

どのような.netコアバージョン使っていますか?プレビュー1?

RTM(preview2--31 ...)への更新 既に修正されているバグが発生した可能性があります。

+0

.net core rc2質問のタイトルにありますが、フルバージョンがリリースされました。 – Calin

+0

申し訳ありませんが、私にとってRC2はpreview1です:SDKとしてD –

0

サービスをそのようなテストサービスで上書きすることはできません。私がしたのは、依存関係を追加し、メソッドを過大にするメソッドを作成することでした。私のテストでは、そのメソッドをオーバーライドし、さまざまな依存関係を注入します。

私は私のブログでも、これを説明する:私は仕事にオーバーライドされたスタートアップクラスを取得するためにしなければならなかったhttp://www.stefanhendriks.com/2016/04/29/integration-testing-your-dot-net-core-app-with-an-in-memory-database/

1

つ以上の追加の変更は、ウェブの実際の名前にIHostingEnvironmentオブジェクトでのApplicationNameを設定することですプロジェクト。

public TestStartup(IHostingEnvironment env) : base(env) 
     { 
      env.ApplicationName = "Demo.Web"; 
     } 

これは、TestStartupが別のアセンブリにあり、元のStartupクラスをオーバーライドする場合に必要です。 私の場合、UseContentRootは依然として必要でした。

名前が設定されていない場合、私は常に404が見つかりません。

関連する問題