web-dev-qa-db-ja.com

dotnetコアテストプロジェクトでユーザーシークレットを使用する方法

統合テスト用のデータベース接続文字列をユーザーシークレットとして保存したいと思います。私の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"
}

テストクラスのコンストラクターに以下を追加しました。

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

私は何かを逃したことがありますか、それとも私がしようとしているものがサポートされていませんか?

12
Paul Hunt

https://patrickhuber.github.io/2017/07/26/avoid-secrets-in-dot-net-core-tests.html 、特にInitialiseTestaddの手順を参照してください。

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

ただし、ビルドサーバーでテストを実行することはできません。

6

アプリケーションのStartupでUserSecretsIdを指定する必要があります。

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

次に、テストプロジェクトで.AddUserSecrets(Assembly assembly)のオーバーロードを使用する必要があります。例:

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

ソース: https://stackoverflow.com/a/40775511/527007

2
Ricardo Fontana