2016-09-30 63 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”]

  • 相关问题