2016-05-27 48 views
10

Sto tentando di eseguire quanto segue in un progetto XUnit per ottenere il connectiontring nel database che i miei test dovrebbero utilizzare:Impossibile leggere ConfigurationBuilder da appsettings.json nella libreria di classi xunit in ASP.NET Core 1.0 RC2

public class TestFixture : IDisposable 
{ 
    public IConfigurationRoot Configuration { get; set; } 
    public MyFixture() 
    { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
     Configuration = builder.Build(); 
    } 

    public void Dispose() 
    {  
    } 
} 

È molto strano perché funziona perfettamente nei modelli WebAPI e MVC quando viene utilizzato in Startup.cs. Inoltre, questo codice funzionava precedentemente in RC1 con dnx, ma ora che ho aggiornato tutto su RC2 e Core CLI non è più possibile trovare il file appsettings.json che si trova nella radice della libreria di classi xunit.

Ecco ciò che la mia classe di test assomiglia in modo da poter vedere come sto chiamando per la configurazione:

public class MyTests : IClassFixture<MyFixture> 
{ 
    private readonly MyFixture _fixture; 
    public MyTests(MyFixture fixture) 
    { 
     this._fixture = fixture; 
    } 

    [Fact] 
    public void TestCase1() 
    { 
     ICarRepository carRepository = new CarRepository(_fixture.Configuration); 
    } 
} 

risposta

16

questo è un problema semplice, è necessario avere la appsetting.json esistere anche sotto il xUnit progetto. O è necessario utilizzare un percorso relativo che punta a dove esiste lo appsettings.json nell'altro progetto.

public class TestFixture : IDisposable 
{ 
    public IConfigurationRoot Configuration { get; set; } 
    public MyFixture() 
    { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("../../OtherProj/src/OtherProj/appsettings.json", 
         optional: true, reloadOnChange: true); 
     Configuration = builder.Build(); 
    } 

    public void Dispose() { } 
} 

Idealmente, si dovrebbe semplicemente avere il proprio file di configurazione locale per il progetto di test. Nel mio ASP.NET Nucleo RC2 progetto di test banca dati, il mio apparecchio simile a questa:

public DatabaseFixture() 
{ 
    var builder = 
     new ConfigurationBuilder() 
      .AddJsonFile("testsettings.json") 
      .AddEnvironmentVariables(); 
    // Omitted... 
} 

Qualora il testsettings.json è la configurazione specifica di prova, locale al progetto.

Aggiornamento

Nella tua project.json assicurarsi che si sta segnando la appsettings.json come copyToOutput. Guarda il schema store per i dettagli.

"buildOptions": { 
    "copyToOutput": { 
    "include": [ "appsettings.json" ] 
    } 
}, 
+0

Forse il mio problema è un'altra cosa, perché il mio appsettings.json è all'interno della radice del mio progetto xUnit. L'ho detto nel mio post: "Non è più possibile trovare il file appsettings.json che si trova nella radice della libreria di classi xunit." Da quando sono passato al nuovo modello RC2 ha iniziato a fallire. Quali pacchetti hai installato nel tuo file project.json se non ti dispiace che me lo chieda, in modo da avere la linea di codice che hai incollato. Voglio assicurarmi di usare gli stessi. –

+0

Ho letto delle impostazioni delle opzioni di compilazione nei nuovi documenti xunit ma non mi ero reso conto che doveva essere fatto anche per appsettings.json. Sì, sarebbe eccellente se tu potessi mostrarmi come farlo. –

+0

Grazie! Un'ultima domanda: usi Microsoft.Extensions.Configuration o Microsoft.Extensions.Configuration.Abstractions quando fai riferimento a IConfigurationRoot da una libreria di classi. Entrambi sembrano funzionare. –

2

Per aggiungere ulteriori informazioni per la risposta @DavidPine s'

percorso qualche modo relativo non funziona per me: ecco come lo faccio.

var builder = new ConfigurationBuilder() 
.SetBasePath(Path.GetFullPath(@"../XXXX")).AddJsonFile("appsettings.json"); 

mio è nucleo .net 1.0.0-preview1-002702

+0

Anche per me ha funzionato con .NET Core 2.0 – Cocowalla

Problemi correlati