如何在dotnet核心测试项目中使用用户机密

Pau*_*unt 9 configuration unit-testing app-secret .net-core

我想将集成测试的数据库连接字符串存储为用户密码.我的project.json看起来像这样:

{
  ...

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

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

  "userSecretsId": "dc5b4f9c-8b0e-4b99-9813-c86ce80c39e6"
}
Run Code Online (Sandbox Code Playgroud)

我已将以下内容添加到我的测试类的构造函数中:

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .AddUserSecrets();
Run Code Online (Sandbox Code Playgroud)

但是,当我运行测试时,当它到达该行时抛出以下异常:

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'.
Run Code Online (Sandbox Code Playgroud)

我错过了什么或是我想要不支持的东西吗?

Ric*_*ana 6

您必须在Startup应用程序中指定 UserSecretsId 。

[assembly: UserSecretsId("xxx")]
namespace myapp
{
    public class Startup
    {
    ...
Run Code Online (Sandbox Code Playgroud)

然后你必须.AddUserSecrets(Assembly assembly)在你的测试项目中使用重载。例子:

.AddUserSecrets(typeof(Startup).GetTypeInfo().Assembly)
Run Code Online (Sandbox Code Playgroud)

来源:https : //stackoverflow.com/a/40775511/5270073


MiF*_*vil 6

请参阅https://patrickhuber.github.io/2017/07/26/avoid-secrets-in-dot-net-core-tests.html中的说明 ,尤其是在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()
Run Code Online (Sandbox Code Playgroud)

但是请注意,它将不允许在构建服务器上运行测试


klo*_*eek -5

对于设置,您可以使用appsettings.json,而不是project.json。它看起来像这样:

{
    "userSecretsId": "dc5b4f9c-8b0e-4b99-9813-c86ce80c39e6"
}
Run Code Online (Sandbox Code Playgroud)

确保通过更改 project.json 将文件复制到输出:

"buildOptions": {
    "copyToOutput": "appsettings.json"
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样检索秘密:

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

    var secret = appSettings["userSecretsId"]
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎只是告诉我如何在 ASP.NET 项目中使用机密,但这不是我在这里所做的。我已经有一个单独的网络项目,在其中我成功地使用了秘密,我要问的是一个类库测试项目。 (3认同)