我正在尝试对最终会在web.config文件中出现的测试值进行单元测试。在我的测试项目中,我创建了一个带有web.config部分的app.config文件来保存设置。在正常情况下,我会调用System.Configuration.ConfigurationSettings.AppSettings,但在这种情况下,这不起作用。我看到了this question,它非常相似,但没有说明如何从配置文件中获取NameValueCollection。以下是配置文件的示例:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<membership defaultProvider="CustomMembershipProvider">
<providers>
<clear/>
<add
name="CustomMembershipProvider"
applicationName="SettlementInfo"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="true"
writeExceptionsToEventLog="true" />
</providers>
</membership>
</system.web>
</configuration>
以前有人处理过这个吗?
答案 0 :(得分:3)
我想我在这里很困惑;看起来您正在尝试测试ASP.NET是否正确使用您的自定义成员资格提供程序。正确?
如果是这样,我99.999%肯定你不能使用MS框架进行单元测试;您必须通过将其部署到Web服务器(或在VS中运行Cassini)并在您的登录页面中键入用户名/密码来集成测试它。
现在,我可能误解了你的要求。如果是这样,请告诉我,我会相应地编辑我的答案。
修改强>
现在,我真的只是在尝试 测试出来的NameValue对 配置文件,以确保 如果价值不存在,我的 正在应用默认值。其他 话说,我想试着拉 applicationName,并验证它 等于“SettlementInfo”,依此类推。 在那之后,我将使用 集成测试以确保 ASP.NET正在使用自定义框架 代替默认的。那样做 有意义吗?
我需要的不仅仅是回复评论,所以我正在编辑。如果我正确地读了你,你想要对你的程序进行单元测试,以确保它正确处理配置,是吗?这意味着你想要确保代码抓取,例如,正确的AppSettings键并处理其中的空值,是否正确?
如果是这样的话,你很幸运;您根本不需要app.config或web.config,您可以在测试设置中设置所需的值。
例如:
[TestMethod]
public void Test_Configuration_Used_Correctly()
{
ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue";
MyClass testObject = new MyClass();
testObject.ConfigurationHandler();
Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigValue");
}
[TestMethod]
public void Test_Configuration_Defaults_Used_Correctly()
{
// you don't need to set AppSettings for a non-existent value...
// ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue";
MyClass testObject = new MyClass();
testObject.ConfigurationHandler();
Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigDefaultValue");
}
答案 1 :(得分:2)
我相信您只有在应用程序实际启动时才能访问webconfig文件。解决方案相当简单 - &gt; “假”你的配置。使用NameValueCollection并改为使用:
private static NameValueCollection CreateConfig()
{
NameValueCollection config = new NameValueCollection();
config.Add("applicationName", "TestApp");
config.Add("enablePasswordReset", "false");
config.Add("enablePasswordRetrieval", "true");
config.Add("maxInvalidPasswordAttempts", "5");
config.Add("minRequiredNonalphanumericCharacters", "2");
config.Add("minRequiredPasswordLength", "6");
config.Add("requiresQuestionAndAnswer", "true");
config.Add("requiresUniqueEmail", "true");
config.Add("passwordAttemptWindow", "10");
return config;
}
现在,您可以轻松地将该集合传递到您的类中,从中解析数据。
答案 2 :(得分:1)
您应该能够使用ConfigurationManager.GetSection()方法提取您想要的任何内容。
答案 3 :(得分:1)
实际上,如果您使用的是NUnit,可以将其粘贴在测试项目的App.config中。 然后将此行添加到Post-build事件:
copy / Y“$(ProjectDir)App.config”“$(TargetDir)$(TargetFileName).config”
在测试中创建新提供程序时,NUnit会将app.config中的值传递给initialize方法中的提供程序。
答案 4 :(得分:0)
为什么不把它放在web.config文件中?