2017-09-27 35 views
2

我正在嘗試單元測試使用Automapper ProjectTo的方法,我不確定如何在MVC Core中註冊映射。我正在使用內置的單元測試。MVC Core 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)...你怎麼「把你的註冊,然後註冊他們在你的集成測試」?我有一個用於生產代碼的配置文件類...但我不知道如何在集成測試中使用它。幫幫我? :) –

+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

創建於Startup類的類或配置AutoMapper和實例(以及調用方法,如適用)班。

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:未映射初始化,使用適當的配置調用Initialize ...「),當我無意中/無意識地在AutoMapper的實例API(我已經配置)和AutoMapper的靜態API(我沒有配置)之間切換時。

仔細觀察錯誤消息中標記的代碼行,我意識到我使用了大寫'M'Mapper.Map()而不是實例成員小寫'm'mapper.Map()。