从我的测试脚本中使用的抽象类访问appsettings

时间:2017-10-02 09:32:53

标签: json unit-testing asp.net-core

使用asp.net core 2.0

我创建了一个BD测试项目。

我有一个像这样结构的抽象基类:

[ExcludeFromCodeCoverage]
[Category("Integration")]
public abstract class BaseIntegrationContext : BaseIntegrationSetUp
{
    protected MyDataBaseContext Context;
    private IWebHostBuilder _webHostBuilder;

    protected override void FixtureSetUp()
    {
        base.FixtureSetUp();
        WebSetUp();
        DbSetUp();
    }

    private void WebSetUp()
    {
        _webHostBuilder = new WebHostBuilder()
            .UseStartup<Startup>();
    }

    private void DbSetUp()
    {
        base.FixtureSetUp();

        //options
        var config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        var options = new DbContextOptionsBuilder<InformedWorkerDbContext>()
            .UseSqlServer(config.GetConnectionString("DefaultConnection"))
            .Options;


        Context = new MyDataBaseContext(options);
    }
}

除非我将appsettings.json复制并添加到此测试项目中,否则显然会收到无法找到json文件的错误。

使用在测试项目中使用的抽象基类访问appsettings.json的可接受方法是什么?

我尝试添加一个名为ServiceSettings的实体模型,该模型映射到我的web项目中的json文件:

public class ServiceSettings
{
    public string DatabaseServerConnection { get; set; }
}

我在startup.cs中实例化:

services.Configure<ServiceSettings>(Configuration.GetSection("ServiceSettings"));

我的Json文件如下所示:

{
  "ServiceSettings": {
    "DatabaseServerConnection": "Server=localhost;Initial,Catalog=InformedWorker;Integrated Security=True;MultipleActiveResultSets=true"
  },



  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Information"
    },
    "Console": {
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    }
  }
}

在我的抽象课中我这样做:

 IOptions<ServiceSettings> myOptions = Options.Create(new ServiceSettings()
    {

    });

但是键入myOptions intellisense只能让我'值'来使用..?

1 个答案:

答案 0 :(得分:0)

  

除非我将appsettings.json复制并添加到此测试项目中,否则显然会收到无法找到json文件的错误。

这是因为您没有在

中指定文件位置
var config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

.AddJsonFile注册JSON FileProvider和路径参数(&#34; appsettings.json&#34;在您的情况下)是相对于ConfigurationBuilder.Properties中存储的基本路径的路径。因此,默认基本路径为null,并且当前工作目录中需要一个文件。

要设置基本路径,您可以使用.SetBasePath(<basePath>)扩展方法

public static IConfigurationBuilder SetBasePath(this IConfigurationBuilder builder, string basePath);

其中basePath:基于文件的提供者的绝对路径。