2017-01-30 4 views
2

Je souhaite stocker une chaîne de connexion de base de données pour mes tests d'intégration en tant que secret d'utilisateur. Mon project.json ressemble à ceci:Comment utiliser les secrets d'utilisateur dans un projet de test de base 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" 
} 

J'ai ajouté ce qui suit au constructeur de ma classe de test:

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

Cependant quand je lance les tests est jeté l'exception suivante quand il frappe cette ligne:

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'. 

Ai-je manqué quelque chose ou est ce que j'essaye de ne pas soutenu?

Répondre

-1

Pour les paramètres, vous pouvez utiliser appsettings.json, pas le projet.json. Il ressemble à ceci:

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

Assurez-vous de copier le fichier sur la sortie en changeant la project.json:

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

vous pouvez maintenant récupérer le secret comme celui-ci:

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

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

Cette semble juste me dire comment utiliser les secrets dans un projet ASP.NET qui n'est pas ce que je fais ici. J'ai déjà un projet Web distinct dans lequel j'utilise avec succès des secrets, ce que je demande est un projet de test de bibliothèque de classes. –

+0

Désolé, j'ai oublié celui-là, je vais voir s'il y a une solution pour ça. – kloarubeek

+0

celui-ci devrait faire l'affaire :-). Je pense que vous avez oublié le copyToOutput. – kloarubeek

2

Vous devez spécifier UserSecretsId dans Startup de votre application.

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

Ensuite, vous devez utiliser la surcharge de .AddUserSecrets(Assembly assembly) dans votre projet de test. Exemple:

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

Source: https://stackoverflow.com/a/40775511/5270073

0

Voir les instructions à https://patrickhuber.github.io/2017/07/26/avoid-secrets-in-dot-net-core-tests.html, en particulier dans InitialiseTest ajouter

// 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() 

noter toutefois qu'il ne permettra pas d'exécuter des tests sur la construction serveur