2017-09-27 13 views
2

Automapper ProjectToを使用するメソッドをユニットテストしようとしていますが、MVCコアにマッピングを登録する方法がわかりません。私は組み込みユニットテストを使用しています。MVCコア2.0のユニットテストとオートマッハ

私のユニットテストは次のとおりです。私は、テストを実行すると、私は次のエラーを取得しています

[TestClass] 
public class BusinessGenderServiceTest 
{ 
    [ClassInitialize] 
    public static void Init(TestContext context) 
    { 

    } 
    [TestMethod] 
    public void GetTest() 
    { 
     var options = new DbContextOptionsBuilder<GotNextDbContext>() 
      .UseInMemoryDatabase(databaseName: "GetTest") 
      .Options; 

     using (var context = new GotNextDbContext(options)) 
     { 


      context.GenderLanguage.Add(new GenderLanguage { Id = 1, Name = "Male", Language = 1 }); 
      context.GenderLanguage.Add(new GenderLanguage { Id = 2, Name = "Female", Language = 1 }); 
      context.GenderLanguage.Add(new GenderLanguage { Id = 3, Name = "Hombre", Language = 2 }); 
      context.GenderLanguage.Add(new GenderLanguage { Id = 4, Name = "Hombre", Language = 2 }); 
      context.SaveChanges(); 
     } 
      using (var context = new GotNextDbContext(options)) 
      { 
       var service = new GenderService(context); 
       var result = service.Get(1); 
       Assert.AreEqual(2, result.Count()); 
      } 

    } 
} 

メッセージ:例外をスローしたGotNext.Test.BusinessGenderServiceTest.GetTest試験方法:

のSystem.InvalidOperationException:マッパーが初期化されていませんが。適切な設定でInitializeを呼び出します。コンテナなどを使用してマッパーインスタンスを使用する場合は、静的なMapper.Mapメソッドを呼び出さないようにしてください。また、ProjectToメソッドまたはUseAsDataSource拡張メソッドを使用している場合は、適切なIConfigurationProviderインスタンス。

+1

1.あなただけのクラスをテストしていないので、それは、統合テストだだけでなく、外部依存関係(AutoMapper、DbContext)2.ちょうどautomapperプロファイルを使用して、どこあなたはあなたの登録を入れて、あなたの統合テストに登録します – Tseng

+0

@ Tsengに関して#2)...あなたはどのように「あなたの登録を入れて、あなたの統合テストに登録しますか?プロダクションコードで使用されているProfilesクラスがありますが、統合テストでどのように使用するかわかりません。助けて? :) –

+0

nm ...私はこれを発見しました:https://github.com/AutoMapper/AutoMapper/wiki/Configuration –

答えて

2

私はこの問題を、各テストクラスのInitメソッドでautomapperを設定して初期化することで解決できました。ユニットテストではありません例えば

[ClassInitialize] 
    public static void Init(TestContext testContext) 
    { 
     var mappings = new MapperConfigurationExpression(); 
     mappings.AddProfile<LocationProfile>(); 
     mappings.AddProfile<CompanyProfile>(); 
     Mapper.Initialize(mappings); 
    } 
0

AutoMapperを構成するクラスを作成し、Startupクラスでインスタンス化して(該当する場合はメソッドを呼び出します)、

1

あなたは、このようなクラスでAutoMapperを設定することができます。

public static class AutoMapperConfig 
    { 
     public static IMapper Initialize() 
     { 
      return new MapperConfiguration((cfg => 
      { 
       cfg.CreateMap<User, UserDto>(); 

      })).CreateMapper(); 
     } 
    } 

そして、次の使用には、startup.cs ConfigureService方法で

services.AddSingleton(AutoMapperConfig.Initialize()); 
+0

私は、startup.csがユニットテストで実行されないという印象を受けました。この仮定は間違っていますか? –

+0

テストプロジェクトのプロジェクトcsprojファイルにprojectreferenceがありますか?次のようなものがあります: Kerni

0

を、私はこの同じエラー( "System.InvalidOperationExceptionが得た:マッパーではないがAutoMapperのInstance API(私が設定したもの)とAutoMapperのStatic API(設定していないもの)を間違って切り替えたときに、適切な設定でCall Initialize ... "

エラーメッセージにフラグが立てられた行をよく見て、私は小文字の 'm' mapper.Map()の代わりに大文字の 'M' Mapper.Map()を使用することを認識しました。

関連する問題