问题
I want to store a database connection string for my integration tests as a user secret. My project.json looks like this:
{
...
"dependencies": {
...
"Microsoft.Extensions.Configuration.UserSecrets": "1.1.0"
},
"tools": {
"Microsoft.Extensions.SecretManager.Tools": "1.1.0-preview4-final"
},
"userSecretsId": "dc5b4f9c-8b0e-4b99-9813-c86ce80c39e6"
}
I've added the following to the constructor of my test class:
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddUserSecrets();
However when I run the tests the following exception is thrown when it hits that line:
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'.
Have I missed something or is what I'm trying to do not supported?
回答1:
See instructions in https://patrickhuber.github.io/2017/07/26/avoid-secrets-in-dot-net-core-tests.html, in particular in InitialiseTest add
// 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()
However note that it will not allow to run tests on build server
回答2:
You must specify the UserSecretsId in Startup
of your application.
[assembly: UserSecretsId("xxx")]
namespace myapp
{
public class Startup
{
...
Then you have to use the overload of .AddUserSecrets(Assembly assembly)
in your test project. Example:
.AddUserSecrets(typeof(Startup).GetTypeInfo().Assembly)
Source: https://stackoverflow.com/a/40775511/5270073
回答3:
For settings you can use appsettings.json, not the project.json. It looks like this:
{
"userSecretsId": "dc5b4f9c-8b0e-4b99-9813-c86ce80c39e6"
}
Make sure to copy the file to output by changing the project.json:
"buildOptions": {
"copyToOutput": "appsettings.json"
}
Now you can retrieve the secret like this:
[Fact]
public MyTest()
{
var appSettings = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var secret = appSettings["userSecretsId"]
}
来源:https://stackoverflow.com/questions/41941503/how-to-use-user-secrets-in-a-dotnet-core-test-project