在没有文件访问权限的情况下获取应用程序设置
Get application settings without file access
我有一个 app.config,工作正常。
但我还有一个自动化测试工具,可以在没有任何文件访问权限的环境中运行一些测试。所以我必须从字符串(或内存流)中读取一个配置文件,但是 没有物理映射它 因为这个自动测试过程无法访问文件系统。
在现实生活中,当然,配置文件存储在某个地方,但出于自动化测试的目的,我需要一些解决方法来从存储在内存中的字符串中读取配置文件。有可能吗?我用谷歌搜索了很多,但我唯一找到的是 Save it as temp file and then read
,但这不是我的情况。
如果没有配置文件,您将使用默认设置。您可以覆盖默认值:
Properties.Settings.Default["PropertyName"] = NewPropertyValue";
(在您的设置 class 上设置正确的访问修饰符,如果它在库中则使用正确的命名空间)
作为第一个选项,我会根据您的情况选择设置文件。
甚至您的用户也无法访问设置文件内容。然后它将 return 特定值的默认值 属性.
您可以尝试创建一个愚蠢的控制台应用程序
static void Main(string[] args)
{
Console.WriteLine(Settings.Default.MyProperty);
Console.ReadLine();
}
您是否在项目属性的设置选项卡上设置了MyProperty的值].
然后你可以构建你的解决方案,打开二进制文件文件夹并删除你的 exe.config 文件,你会看到应用程序将使用默认值。
作为第二个选项,您可以使用命令行参数。也可能是您的选择。 (这里是关于命令行参数的一些棘手案例的文章 Backslash and quote in command line arguments )
第三个选项可能是将您的文件放在 c:\users\your 应用程序用户 \AppData\Roaming\YourAppName 文件夹中。在这里你应该被授予文件访问权限,即使是受限用户
出于教育原因,我还建议您阅读这篇文章:https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(ApplicationSettingsOverview);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true
也许您觉得 "Load Web Settings" 选项不错。
另一个调查地点可能是
避免 class 对 app.config 或任何其他文件的直接依赖。您的 class 不需要 app.config 或 Properties.Settings
。它需要 那些文件中包含的值。。
如果您出于测试目的创建变通方法,那么您正在测试 class 的不同版本。这是固有的问题——对这些文件的直接依赖是不可测试的。这并不意味着它们在某些方面不好或者我们不应该使用它们,只是需要这些值的 class 不应该从文件中读取它们。
一个理想的解决方案是构造函数注入,一种依赖注入形式。在其构造函数中将值提供给 class 并将其存储为字段。这样,当创建 class 时,它始终具有所需的值。
在运行时,您可以使用依赖注入容器 - 这里是 walkthrough on setting one up for WCF。您可能处于不同的项目类型中,但这些概念仍然适用。
但是对于测试来说,这就像创建一个 class 并将您想要使用的任何值传递给构造函数一样简单。当 class 从设置中读取时,不可能用不同的值进行测试,但使用构造函数注入很容易。
我有一个 app.config,工作正常。
但我还有一个自动化测试工具,可以在没有任何文件访问权限的环境中运行一些测试。所以我必须从字符串(或内存流)中读取一个配置文件,但是 没有物理映射它 因为这个自动测试过程无法访问文件系统。
在现实生活中,当然,配置文件存储在某个地方,但出于自动化测试的目的,我需要一些解决方法来从存储在内存中的字符串中读取配置文件。有可能吗?我用谷歌搜索了很多,但我唯一找到的是 Save it as temp file and then read
,但这不是我的情况。
如果没有配置文件,您将使用默认设置。您可以覆盖默认值:
Properties.Settings.Default["PropertyName"] = NewPropertyValue";
(在您的设置 class 上设置正确的访问修饰符,如果它在库中则使用正确的命名空间)
作为第一个选项,我会根据您的情况选择设置文件。 甚至您的用户也无法访问设置文件内容。然后它将 return 特定值的默认值 属性.
您可以尝试创建一个愚蠢的控制台应用程序
static void Main(string[] args)
{
Console.WriteLine(Settings.Default.MyProperty);
Console.ReadLine();
}
您是否在项目属性的设置选项卡上设置了MyProperty的值]. 然后你可以构建你的解决方案,打开二进制文件文件夹并删除你的 exe.config 文件,你会看到应用程序将使用默认值。
作为第二个选项,您可以使用命令行参数。也可能是您的选择。 (这里是关于命令行参数的一些棘手案例的文章 Backslash and quote in command line arguments )
第三个选项可能是将您的文件放在 c:\users\your 应用程序用户 \AppData\Roaming\YourAppName 文件夹中。在这里你应该被授予文件访问权限,即使是受限用户
出于教育原因,我还建议您阅读这篇文章:https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(ApplicationSettingsOverview);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true 也许您觉得 "Load Web Settings" 选项不错。
另一个调查地点可能是
避免 class 对 app.config 或任何其他文件的直接依赖。您的 class 不需要 app.config 或 Properties.Settings
。它需要 那些文件中包含的值。。
如果您出于测试目的创建变通方法,那么您正在测试 class 的不同版本。这是固有的问题——对这些文件的直接依赖是不可测试的。这并不意味着它们在某些方面不好或者我们不应该使用它们,只是需要这些值的 class 不应该从文件中读取它们。
一个理想的解决方案是构造函数注入,一种依赖注入形式。在其构造函数中将值提供给 class 并将其存储为字段。这样,当创建 class 时,它始终具有所需的值。
在运行时,您可以使用依赖注入容器 - 这里是 walkthrough on setting one up for WCF。您可能处于不同的项目类型中,但这些概念仍然适用。
但是对于测试来说,这就像创建一个 class 并将您想要使用的任何值传递给构造函数一样简单。当 class 从设置中读取时,不可能用不同的值进行测试,但使用构造函数注入很容易。