2017-01-30 11 views
2

Я хочу сохранить строку подключения базы данных для своих тестов интеграции в качестве секретности пользователя. Моя project.json выглядит следующим образом:Как использовать секреты пользователя в тестовом проекте ядра dotnet

{ 
    ... 

    "dependencies": { 
    ... 
    "Microsoft.Extensions.Configuration.UserSecrets": "1.1.0"   
    }, 

    "tools": { 
    "Microsoft.Extensions.SecretManager.Tools": "1.1.0-preview4-final" 
    }, 

    "userSecretsId": "dc5b4f9c-8b0e-4b99-9813-c86ce80c39e6" 
} 

Я добавил следующий конструктору мой тестовый класс:

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() 
    .AddJsonFile("appsettings.json") 
    .AddUserSecrets(); 

Однако, когда я запускаю тесты следующего исключение, когда она попадет что линия:

An exception of type 'System.InvalidOperationException' occurred in Microsoft.Extensions.Configuration.UserSecrets.dll but was not handled in user code 

Additional information: Could not find 'UserSecretsIdAttribute' on assembly 'dotnet-test-nunit, Version=3.4.0.0, Culture=neutral, PublicKeyToken=null'. 

Я что-то пропустил или что я пытаюсь не поддерживать?

ответ

-1

Для настроек вы можете использовать appsettings.json, а не project.json. Это выглядит следующим образом:

{ 
    "userSecretsId": "dc5b4f9c-8b0e-4b99-9813-c86ce80c39e6" 
} 

Убедитесь, чтобы скопировать файл на выходе путем изменения project.json:

"buildOptions": { 
    "copyToOutput": "appsettings.json" 
} 

Теперь вы можете восстановить секрет, как это:

[Fact] 
public MyTest() 
{ 
    var appSettings = new ConfigurationBuilder() 
     .SetBasePath(Directory.GetCurrentDirectory()) 
     .AddJsonFile("appsettings.json") 
     .Build(); 

    var secret = appSettings["userSecretsId"] 
} 
+1

Этот просто кажется, что мне рассказывают, как использовать секреты в проекте ASP.NET, и это не то, что я здесь делаю. У меня уже есть отдельный веб-проект, в котором я успешно использую секреты, о чем я спрашиваю, это тестовый проект библиотеки классов. –

+0

Извините, я забыл, что один, я посмотрю, есть ли решение для этого. – kloarubeek

+0

этот должен сделать трюк :-). Я думаю, вы забыли copyToOutput. – kloarubeek

2

Вы должны указать UserSecretsId в Startup вашего приложения.

[assembly: UserSecretsId("xxx")] 
namespace myapp 
{ 
    public class Startup 
    { 
    ... 

Тогда вы должны использовать перегрузку .AddUserSecrets(Assembly assembly) в тестовом проекте. Пример:

.AddUserSecrets(typeof(Startup).GetTypeInfo().Assembly) 

Источник: https://stackoverflow.com/a/40775511/5270073

0

См инструкции в https://patrickhuber.github.io/2017/07/26/avoid-secrets-in-dot-net-core-tests.html, в частности, в InitialiseTest добавить

// the type specified here is just so the secrets library can 
      // find the UserSecretId we added in the csproj file 
      var builder = new ConfigurationBuilder() 
       .AddUserSecrets<HttpClientTests>(); 

      Configuration = builder.Build() 

Однако обратите внимание, что он не позволит запускать тесты на сервере сборки

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

  • Нет связанных вопросов^_^