我以前使用过很多次这个配置,从来没有遇到过任何问题,所以我把我的项目简化为基础。我将Specflow与Specrun一起使用,而Specrun部分是唯一发生变化的部分。
我正在尝试使用appsettings.json文件配置serilog记录器,该文件位于my.net核心bin基本目录中。\bin\Debug\netcoreapp3.1
以前我可以在没有路径的情况下引用appsettings,但当我从NUnit移到Specflow时,情况发生了变化。仍然使用basepath仍然可以找到位置。然而,当我尝试创建记录器并使用readfrom时,它引用的是来自一个奇怪位置的appsettings文件,而不是我刚刚设置的配置变量中的ConfigurationRoot。
以下是两个设置变量。第一个用于appsettings的配置根,第二个用于serilog记录器。第一个是成功的,它给了我一个看起来有效的IConfiguration对象。第二个是错误发生的地方。此错误为"System.IO.FileNotFoundException:"找不到文件"\bin\Debug\netcoreapp3.1\SpecFlowPlusRunner\netcoreapps3.1\TechTalk.SpecRun.Framework.Executor.anycpu.netcoreapp3_1.deps.json"。";
var configuration = new ConfigurationBuilder()
.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
.AddJsonFile("appsettings.json")
.Build();
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
一些需要注意的附加信息。这是一个netcore 3.1应用程序代码在specflow类中执行包含的软件包为。
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.6" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.6" />
<PackageReference Include="Serilog" Version="2.9.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.Seq" Version="4.0.0" />
<PackageReference Include="SpecFlow" Version="3.3.57" />
<PackageReference Include="SpecFlow.NetCore" Version="1.3.5" />
<PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.3.57" />
<PackageReference Include="SpecRun.SpecFlow" Version="3.3.41" />
我认为配置的基本路径是错误的。Assembly.GetExecutingAssembly()
可能正在返回一个SpecFlow+Runner程序集,该程序集包含在SpecFlowPlusRunner
子文件夹中。
为了获取测试程序集所在的文件夹,我们为其提供了API:TestRunContext.TestDirectory
(https://docs.specflow.org/projects/specflow-runner/en/latest/Usage/SpecFlow-Runner-APIs.html#string-testdirectory-get(。
这样,您就可以获得appsettings.json所在的正确文件夹。
全面披露:我是SpecFlow和SpecFlow+的开发人员之一。