views:

2201

answers:

4

I'm trying to unit test values that will eventually wind up in a web.config file. In my test project, I created an app.config file with a web.config section to hold the settings. In a normal situation, I would call System.Configuration.ConfigurationSettings.AppSettings, but in this case, that doesn't work. I saw this question, which is very similar, but doesn't address how to get the NameValueCollection out of the config file. Here is an example of the config file:

<?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>

Has anyone dealt with this before?

A: 

Why not just stick it in the web.config file?

Kevin
I'm in a class library for unit testing, so I'm using the app.config. Once I get to adding it to my web project, it'll go in a web.config.
Mark Struzinski
Is there a way to reference a web.config file from a class library?
Mark Struzinski
+1  A: 

I guess I'm confused here; it looks like you're trying to test that ASP.NET is using your custom membership provider appropriately. Correct?

If so, I'm 99.999% sure that you cannot unit test this using the MS framework; you must integration test it by deploying it to the webserver (or running Cassini in VS) and typing a username/password into your login page.

Now, it's possible I've misunderstood your request. If so, let me know and I'll edit my answer accordingly.

Edit:

For right now, I'm really just trying to test the NameValue pairs coming out of the config file, to make sure that if the values aren't present, my defaults are being applied. In other words, I want to try to pull applicationName, and verify that it equals "SettlementInfo", and so on. After that, I will be using integration testing to ensure that ASP.NET is using the custom framework in place of the default one. Does that make sense?

I need more than a comment to reply, so I'm editing. If I read you correctly, you are wanting to unit test your program to ensure that it deals with configuration correctly, yes? Meaning you want to ensure that your code grabs, for example, the correct AppSettings key and handles a null value therein, correct?

If that's the case, you're in luck; you don't need an app.config or web.config at all, you can set the values you need as part of your test setup.

For example:

[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");
}
Randolpho
For right now, I'm really just trying to test the NameValue pairs coming out of the config file, to make sure that if the values aren't present, my defaults are being applied. In other words, I want to try to pull applicationName, and verify that it equals "SettlementInfo", and so on.
Mark Struzinski
After that, I will be using integration testing to ensure that ASP.NET is using the custom framework in place of the default one. Does that make sense?
Mark Struzinski
See my edit for an answer. I may still not understand where you're going with this, but if it's what I think it is, this should start you in the right direction.
Randolpho
This did it. I just needed to think about the problem in a different way. Thanks for the help!
Mark Struzinski
Glad that worked. :)
Randolpho
+1  A: 

You should be able to use the ConfigurationManager.GetSection() method to pull out whatever you want.

Jason DeFontes
I've tried ConfigurationManager.GetSection() on the system.web and membership sections. Both return null. Am I doing something wrong?
Mark Struzinski
A: 

I believe you only have access to the webconfig file while your application is actually beeing started up. The solution is rather easy -> "Fake" your config. Use a NameValueCollection and use that instead:

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;
}

Now you could easily pass that collection into your class that parses data from it.

Norman