2016-10-17 7 views
0

私はConfigureServices()機能でこのnunit dotnet core testプロジェクトでappsettingsを使用するには?

Startup.cs

services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 

Controller.cs

private readonly AppSettings _AppSettings; 

public UserProfilesController(IOptions<AppSettings> appSettings) 
{ 
    _AppSettings = appSettings.Value; 
} 

しかし、私のようなappsettings.jsonファイルから私のAPIプロジェクトでのAppSettingsを追加することができました私のテストプロジェクトでこれをどうやって行うのか分かりません。テストプロジェクトにはStartup.tsがありません。どうすれば私のテストプロジェクトに同じ方法でappsettingsを追加できますか?

EDIT:

一つNUnitのテスト

[Test] 
    public void Post_Should_Create_A_Single_UserProfile() 
    { 
     // Arrange 
     var profile = Dummy.GenerateCreateUserProfileDto(); 

     MyMvc 
     .Controller<UserProfilesController>() 
     .Calling(c => c.Post(profile)) 
     .ShouldReturn() 
     .Ok() 
     .WithResponseModelOfType<UserProfileDto>() 
     .Passing(target => 
     { 
      target.Should().NotBeNull(because: "a record is expected here"); 
      target.Id.Should().BeGreaterThan(0, because: "a id is expected"); 
      target.ShouldBeEquivalentTo(profile, opt => opt 
       .Excluding(c => c.Id) 
       .Excluding(c => c.CreatedOn) 
       .Excluding(c => c.ModifiedOn), 
       because: "the record returned is expected to be the same as the record inserted"); 

      // Clean up 
      _Repo.Delete(target.Id); 
     }); 
    } 

私のポスト機能

[HttpPost] 
    public async Task<IActionResult> Post([FromBody]CreateUserProfileDto profile) 
    { 
     using (var fileManager = new FileManager()) 
     using (var manager = new UserProfilesRepository()) 
     { 
      var mapped = Mapper.Map<UserProfile>(profile); 
      // Only save the profile image if one is selected 
      if (!string.IsNullOrEmpty(profile.Image)) 
      { 
       try 
       { 
        var result = fileManager.SaveProfileImage(
         profile.Image, 
         _AppSettings.Profile.AbsolutePath, 
         _AppSettings.BaseUrl, 
         _AppSettings.Profile.RelativePath 
        ); 
        mapped.FilePath = result.AbsolutePath; 
        mapped.ProfilePicture = result.RelativePath; 
       } 
       catch (Exception ex) 
       { 
        return StatusCode(500); 
       } 
      } 

      manager.Save(mapped); 

      return Ok(Mapper.Map<UserProfileDto>(mapped)); 
     } 
    } 
+0

は、ユニットテストのコードを表示します。単体テストでIOptionsインターフェイスを簡単にモックすることもできます。 – Nkosi

+0

@ Nkosi私は、nsetを使用するコントローラにnunitテストとポストコードのいずれかを掲示しました。 –

+0

このNunitをアプリケーションの一部として使用しているのですか、それとも別のプロジェクトですか? –

答えて

1

あなたが見ている問題は、MyTested mockingフレームワークを使用することによるアーチファクトです。コントローラーの依存関係のモック値を持つコントローラー(IOptions<AppSettings>インスタンス)を作成します。このモックは、特に設定されていないプロパティのデフォルト値(null)を返します。

単体テストの場合は、実際にConfigurationBuilderなどを使用してアプリケーションセットからロードすることでテストしたくありません。代わりに、AppSettingsオブジェクトを明示的に定義された値でテストに依存する必要があります。

MyTested.AspNetCore.Mvc

using MyTested.AspNetCore.Mvc.DependencyInjection; 

[Test] 
public void Post_Should_Create_A_Single_UserProfile() 
{ 
    // Arrange 
    var profile = Dummy.GenerateCreateUserProfileDto(); 

    MyMvc 
    .Controller<UserProfilesController>() 
    .WithOptions(options => options 
     .For<AppSettings>(settings => settings.Cache = true)) 
    .Calling(c => c.Post(profile)) 
    .ShouldReturn() 
    .Ok() 
} 

オリジナル回答:MyTested。例えばWEBAPI

、あなたはこのような何かがあります

using Microsoft.Extensions.Options; 

[Test] 
public void Post_Should_Create_A_Single_UserProfile() 
{ 
    // Arrange 
    var profile = Dummy.GenerateCreateUserProfileDto(); 
    var mockedSettings = new AppSettings 
    { 
     MyValue = "the test value" 
    } 

    MyMvc 
    .Controller<UserProfilesController>() 
    .WithResolvedDependencyFor<IOptions<AppSettings>>(Options.Create(mockedSettings)) 
    .Calling(c => c.Post(profile)) 
    .ShouldReturn() 
    .Ok() 
} 
+0

ご返信ありがとうございます。大変感謝しています!私は 'WithResolvedDependencyFor'を使っているようです。私は最初に不足している依存関係を推測していますか?もう助けてもらえますか? 'IControllerBuilder 'に' WithResolvedDependencyFor 'の定義がなく、拡張メソッド' WithResolvedDependencyFor 'がタイプ' IControllerBuilder 'の最初の引数を受け入れません。 –

+0

ああ - 前に間違ったバージョンにリンクしました。私の答えを更新します – Sock

+0

コードサンプルを 'MyTest.AspNetCore.MVC'に更新しました – Sock

1

あなたはそれをテストするために、あなたのMVCコントローラをからかっています。このようにして、オブジェクトを渡してUserProfilesControllerを作成する必要があります。

もう1つの方法は、アプリケーションを起動してStartup.csクラスを使用してテストすることです。 私はNUnitのを使用したことがありませんが、xUnitので、私はこのように私のテストプロジェクトを設定します。

TestServer testServer = new TestServer(new WebHostBuilder().UseEnvironment("Development").UseStartup<Startup>()); 

私はDevelopment環境を使用していますので、私はまた私のテストプロジェクトでappsettings.Development.jsonファイルが必要です。

その後、あなたは、このように作成で-memmoryサーバーを使用することができます。

testServer.CreateClient().PostAsync(string requestUri, HttpContent content) 

EDIT:

TESTSERVERは、Microsoftのパッケージからである:

"Microsoft.AspNetCore.TestHost": "1.0.0" 

だから、それをnUnitとうまく動作するはずです。

関連する問題