问题描述
我试图重新创建我的BeforeTestRun步骤,以使整个执行过程而不是每个线程仅运行一次安装程序。
我看了一个自定义部署步骤,我已经实现了一些步骤,但是对于我的设置,我需要从app.config文件中引入一些值,我正在尝试类似的事情
我的Default.srprofile文件包含:
<DeploymentTransformation>
<GlobalSteps>
<Custom type="Test.CustomDeploymentStep,Test"></Custom>
</GlobalSteps>
</DeploymentTransformation>
和我的CustomDeploymentStep.cs:
public class CustomDeploymentStep : IDeploymentTransformationStep
{
public static string baseUrl;
public void Apply(IDeploymentContext deploymentContext)
{
baseUrl = ConfigurationManager.AppSettings["URL"];
}
public void Restore(IDeploymentContext deploymentContext)
{
DoSomething();
}
}
我的应用程序配置包含以下内容:
<add key="URL" value="http://google.com" />
但这不起作用,ConfigurationManager.AppSettings
仅返回一个键和一个值
"key" : "TestProjectRetargetTo35Allowed" "value":"true"
如何将app.config中的配置加载到CustomDeploymentStep中的Apply()
方法中?
此外,如果有一种更好/更有效的方式在Specflow中通过线程安全执行生成预定义数据,请告诉我
解决方法
当我需要在大型解决方案的多个项目中使用自定义部署步骤时,我遇到了同样的问题。这似乎是 TechTalk.SpecRun.Framework 中的一个错误。错误可能是“应用全局部署步骤时出错。全局步骤不能包含测试程序集特定设置。”如果您在调试时查看 TestAssembly 内部,您将看到 TestAssemblyConfigFilePath 为空和/或吞下另一个异常。
它不注册项目特定的配置文件。我的解决方法是将配置文件保存到调试中并像这样访问我需要的内容:
string appConfigFilePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\App.config";
ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = appConfigFilePath;
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap,ConfigurationUserLevel.None);
var baseUrl = config.AppSettings.Settings["URL"].Value;