Answers:
最简单的方法是.config
在单元测试的“部署”部分中添加文件。
为此,请.testrunconfig
从“解决方案项目”中打开文件。在“部署”部分中,.config
从项目的构建目录(大概是bin\Debug
)中添加输出文件。
在运行测试之前,“部署”部分中列出的所有内容都将被复制到测试项目的工作文件夹中,因此与配置相关的代码可以正常运行。
编辑:我忘了添加,这在所有情况下都无法使用,因此您可能需要包含一个启动脚本,该脚本将输出重命名.config
以匹配单元测试的名称。
无论您使用的是Team System Test还是NUnit,最佳实践都是为测试创建一个单独的类库。 只需将App.config添加到Test项目中,即可在编译时自动将其复制到bin文件夹中。
如果您的代码依赖于特定的配置测试,则我要编写的第一个测试将验证配置文件是否可用(这样,我就知道自己不是疯了):
<configuration>
<appSettings>
<add key="TestValue" value="true" />
</appSettings>
</configuration>
和测试:
[TestFixture]
public class GeneralFixture
{
[Test]
public void VerifyAppDomainHasConfigurationSettings()
{
string value = ConfigurationManager.AppSettings["TestValue"];
Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
}
}
理想情况下,您应该编写代码,以便将配置对象传递到类中。这不仅使您摆脱了配置文件问题的困扰,而且还使您可以针对不同的配置方案编写测试。
public class MyObject
{
public void Configure(MyConfigurationObject config)
{
_enabled = config.Enabled;
}
public string Foo()
{
if (_enabled)
{
return "foo!";
}
return String.Empty;
}
private bool _enabled;
}
[TestFixture]
public class MyObjectTestFixture
{
[Test]
public void CanInitializeWithProperConfig()
{
MyConfigurationObject config = new MyConfigurationObject();
config.Enabled = true;
MyObject myObj = new MyObject();
myObj.Configure(config);
Assert.AreEqual("foo!", myObj.Foo());
}
}
如果您有一个包含例如Web应用程序和测试项目的解决方案,则可能希望测试项目使用Web应用程序的web.config。
解决该问题的一种方法是将web.config复制到测试项目,然后将其重命名为app.config。
另一个更好的解决方案是修改构建链,使其自动复制web.config以测试项目输出目录。为此,请右键单击“测试应用程序”,然后选择属性。现在您应该看到项目属性。单击“构建事件”,然后单击“编辑构建后...”按钮。将以下行写到那里:
copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"
然后单击确定。(请注意,您很可能需要将WebApplication1更改为要测试的项目名称)。如果您有错误的web.config路径,则复制将失败,并且在构建失败期间您会注意到它。
编辑:
要从当前项目复制到测试项目:
copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"
.config
文件。感谢分享!:)
web.config
仅引用.config
同一项目中的外部文件时会发生什么。由于该路径只能指向同一目录中的文件夹(通常是正确的),因此在运行测试时,它将无法处理这些外部文件。知道如何解决吗?
这有点旧,但是我为此找到了更好的解决方案。我在这里尝试选择的答案,但看起来.testrunconfig已经过时了。
对于单元测试,配置实际上不应该包含在测试中,因此请创建一个可以注入的模拟。在此示例中,我使用的是Moq。
Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");
我使用NUnit,并且在项目目录中有我的App.Config副本,可以更改一些配置(例如,我重定向到测试数据库...)。您需要将其放在测试项目的同一目录中,这样就可以了。