2016-09-30 153 views
5

我的Web應用程序需要從appsettings.json文件中讀取文檔DB鍵。我已創建了關鍵的名稱和讀取配置部分一類ConfigureaServices()爲:在.NET核心測試項目中讀取appsettings json值

public Startup(IHostingEnvironment env) { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddEnvironmentVariables(); 

     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    public void ConfigureServices(IServiceCollection services) { 
     services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()); 
     services.AddSession(); 
     Helpers.GetConfigurationSettings(services, Configuration); 
     DIBuilder.AddDependency(services, Configuration); 
    } 

我正在尋找讀取測試項目中的鍵值的方式。

+0

https://docs.asp.net/en/latest/fundamentals/configuration.html#configuration – Nkosi

回答

3

project.json從你的測試項目,添加下面的依賴關係:

"dependencies": { 
    "xunit": "2.2.0-beta2-build3300", 
    "Microsoft.AspNetCore.TestHost": "1.0.0", 
    "dotnet-test-xunit": "2.2.0-preview2-build1029", 
    "BancoSentencas": "1.0.0-*" 
}, 

BancoSentencas是我要測試的項目。其他軟件包來自xUnit和TestHost,它們將成爲我們的內存服務器。

還包括爲appsettings.json此配置選項:

"buildOptions": { 
    "copyToOutput": { 
    "include": [ "appsettings.Development.json" ] 
    } 
} 

在我的測試項目中,我有以下的測試類:

public class ClasseControllerTeste : IClassFixture<TestServerFixture> { 

    public ClasseControllerTeste(TestServerFixture fixture) { 
     Fixture = fixture; 
    } 

    protected TestServerFixture Fixture { get; private set; } 


    [Fact] 
    public async void TestarRecuperarClassePorId() { 
     using(var client = Fixture.Client) { 
     var request = await Fixture.MyHttpRequestMessage(HttpMethod.Get, "/api/classe/1436"); 
     var response = await client.SendAsync(request); 
     string obj = await response.Content.ReadAsStringAsync(); 
     ClasseModel classe = JsonConvert.DeserializeObject<ClasseModel>(obj); 
     Assert.NotNull(classe); 
     Assert.Equal(1436, classe.Id); 
     } 
    } 
    } 

而且我也有TestServerFixture類,將配置內存服務器:

public class TestServerFixture : IDisposable { 
    private TestServer testServer; 
    protected TestServer TestServer { 
     get { 
     if (testServer == null) 
      testServer = new TestServer(new WebHostBuilder().UseEnvironment("Development").UseStartup<Startup>()); 
     return testServer; 
     } 
    } 

    protected SetCookieHeaderValue Cookie { get; set; } 

    public HttpClient Client { 
     get { 
     return TestServer.CreateClient(); 
     } 
    } 

    public async Task<HttpRequestMessage> MyHttpRequestMessage(HttpMethod method, string requestUri) {  
     ... 
     login stuff... 
     ... 
     Cookie = SetCookieHeaderValue.Parse(response.Headers.GetValues("Set-Cookie").First()); 

     var request = new HttpRequestMessage(method, requestUri); 

     request.Headers.Add("Cookie", new CookieHeaderValue(Cookie.Name, Cookie.Value).ToString()); 
     request.Headers.Accept.ParseAdd("text/xml"); 
     request.Headers.AcceptCharset.ParseAdd("utf-8"); 
     return request; 
    } 

    public void Dispose() { 
     if (testServer != null) { 
     testServer.Dispose(); 
     testServer = null; 
     } 
    } 
    } 

這就是我如何測試我的項目。我用的是Startup.cs從主體工程,我在我的測試項目創建一個從appsettings.json複印件(appsettings.Development.json)

+0

這是什麼TESTSERVER?你的自定義課程? –

+0

它是'Microsoft.AspNetCore.TestHost'包中的一個類。你在使用xUnit嗎?我要編輯我的答案並提供更多細節。 –

+0

是的。我也在使用xUnit。 –

4

老實說,如果你是單元測試的應用程序,你應該嘗試將您正在測試的類與所有依賴關係隔離,例如調用其他類,訪問文件系統,數據庫,網絡等。除非您正在進行集成測試或功能測試。

說了這麼多,爲了對應用程序進行單元測試,您可能需要模擬這些來自您的appsettings.json文件的值,並測試您的邏輯。

所以你的appsettings.json看起來像這樣。

"DocumentDb": { 
    "Key": "key1" 
} 

然後創建一個設置類。

public class DocumentDbSettings 
{ 
    public string Key { get; set; } 
} 

然後註冊它在ConfigureServices()方法。

services.Configure<DocumentDbSettings>(Configuration.GetSection("DocumentDb")); 

然後例如你的控制器/類可能看起來像這樣。

// ... 
private readonly DocumentDbSettings _settings; 

public HomeController(IOptions<DocumentDbSettings> settings) 
{ 
    _settings = settings.Value; 
} 
// ... 
public string TestMe() 
{ 
    return $"processed_{_settings.Key}"; 
} 

然後在您的測試項目中,您可以創建這樣的單元測試類。

public class HomeControllerTests 
{ 
    [Fact] 
    public void TestMe_KeyShouldBeEqual_WhenKeyIsKey1() 
    { 
     // Arrange 
     const string expectedValue = "processed_key1"; 
     var configMock = Substitute.For<IOptions<DocumentDbSettings>>(); 
     configMock.Value.Returns(new DocumentDbSettings 
     { 
      Key = "key1" // Mocking the value from your config 
     }); 

     var c = new HomeController(configMock); 

     // Act 
     var result = c.TestMe(); 

     // Assert 
     Assert.Equal(expectedValue, result); 
    } 
} 

我用NSubstitute v2.0.0-rc來嘲笑。

-1

將appSettings.json複製到您的Test項目根目錄,並將其屬性標記爲內容並將其標記爲新的。 var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); ConfigurationManager.Configuration = builder.Build(); ConfigurationManager是一個類,它有一個靜態屬性配置。這樣,整個應用程序可以直接訪問它ConfigurationManager.Configuration []

+0

上半場是正確的。使用靜態ConfigurationManager.Configuration聽起來不正確。 –

1

基於http://www.jerriepelser.com/blog/using-configuration-files-in-dotnet-core-unit-tests/文章(爲核心1.0書面)

1.創建(或複製)的整合測試項目根appsettings.json目錄並在屬性中指定「構建操作」爲內容,並將「如果更新則複製」到輸出目錄。

2.如果尚未包含JSON配置文件NuGet包(Microsoft.Extensions.Configuration.Json),請將其包含在內。

3.In測試項目創建方法

public static IConfiguration InitConfiguration() 
     { 
      var config = new ConfigurationBuilder() 
       .AddJsonFile("appsettings.json") 
       .Build(); 
       return config; 
     } 
  • 使用配置照常

    變種配置= InitConfiguration();
    VAR的clientId =配置[ 「CLIENT_ID」]

  • 相關問題