【发布时间】:2014-01-21 14:36:13
【问题描述】:
我正在使用 MSTest 测试应用程序。测试需要某些特定值(通常不存在)出现在应用程序配置文件中。
所以我需要在测试运行时替换一个包含值的知名配置文件,以便 System.Configuration.ConfigurationManager 指向正确的文件。 (即,我通过替换我之前制作的另一个文件来伪造真实的配置文件)
我可以做所有这些,除了在我的测试执行时,System.Configuration.ConfigurationManager 已经读取了配置文件,因此新值将被忽略。
示例代码:
static TemporaryConfigFile config;
[ClassInitialize]
public static void ClassInitialise(TestContext testContext)
{
string sourceResource = "Intra_Matrix_Scheduler_Tests.Resources.test.config";
string tempConfigFileName = "test.config";
config = TemporaryConfigFile.CreateFromEmbeddedResource(Assembly.GetExecutingAssembly(), sourceResource, tempConfigFileName);
}
[ClassCleanup]
public static void ClassCleanUp()
{
config.Dispose();
}
(上面的代码创建了一个具有已知测试值的新配置文件,并将 AppDomain.CurrentDomain("APP_CONFIG_FILE") 指向它。在生产代码中,如果在开始时完成,这种重新路由到另一个配置文件的技术非常有效应用程序)
问题在于以下生产线在进行测试时,无法检索到所需的测试值:
var dict = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("ScheduledTasks");
原因很明显,虽然生产代码行和测试代码现在指向正确的配置文件,但生产配置文件已经加载到内存中,因此测试配置文件实际上被忽略了。
所以问题是:如何强制 System.Configuration.ConfigurationManager 重新读取配置文件,或者如何伪造配置文件?或者,如何在测试期间直接修改内存配置文件? (AFAIK 我不能使用依赖注入和 MOQ 来模拟它,因为 System.Configuration.ConfigurationManager 是静态的)
TIA
【问题讨论】:
标签: c# unit-testing mocking mstest