2016-10-17 3 views
0

мне удалось добавить AppSettings в моем Api проекта из файла appsettings.json как этотКак использовать appsettings в проекте тестирования ядра nunit dotnet?

Startup.cs в ConfigureServices() функции

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

Controller.cs

private readonly AppSettings _AppSettings; 

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

Но я не знаю, как это сделать для моего тестового проекта. У меня нет Startup.ts в моем тестовом проекте. Итак, как я могу добавить настройки приложения таким же образом в своем тестовом проекте?

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 Я опубликовал один из тестов nunit и почтовый код контроллера, который использует настройки appsettings. –

+0

Вы используете этот Nunit как часть своего приложения или это другой проект? –

ответ

1

Проблема, которую вы видите, является артефактом использования MyTested mocking framework. Он создает контроллер с макетными значениями для зависимостей контроллера (пример 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

Ah - вы ранее не связаны с версией, я буду обновить мой ответ – Sock

+0

Обновлен образец кода до 'MyTest.AspNetCore.MVC' – Sock

1

Вы насмешливый свой MVC контроллер, чтобы проверить его. Таким образом, вы должны создать свой UserProfilesController, проходя мимо объекта appSettings.

Другой вариант - запустить приложение для его проверки с использованием класса 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.

Смежные вопросы