Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How would I unit test this .Net code (refactoring allowed)

I have been spinning my wheels now for awhile trying to figure out how I can possibly unit test the following code. At first I was going to use Moq to mock everything, but it doesn't include the ability to mock sealed classes. I know I need to abstract out the calls to the implementation (Configuration) using an interface? but I can't seem to make it all work right.

The code can be altered but I would prefer to keep the methods static, unless you can present a compelling reason not to. You can add interfaces or create whatever seams are needed. Also, GetConnStringByName() can be refactored to return the relevant string instead of a ConnectionStringSettings.

Thoughts?

namespace Stackoverflow.Rocks
{
    /// <summary>
    /// Utility class for progmattically selecting values from the Web.config file.
    /// </summary>
    public class WebConfigStrings
    {
        //private static Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);

        /// <summary>
        /// Retrieves the desired connection string value based upon the target name.
        /// </summary>
        /// <param name="connectionStringName">The target connection string referenced in the Web.Config</param>
        /// <returns>The value specified in the Web.Config by your connectionStringName</returns>
        public static ConnectionStringSettings GetConnStringByName(string connectionStringName)
        {
            Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
            ConnectionStringSettings connString;
            connString = rootWebConfig.ConnectionStrings.ConnectionStrings[connectionStringName];
            return connString;
        }

        /// <summary>
        /// Retrieves the desired application string value based upon the target name.
        /// </summary>
        /// <param name="applicationStringName">The target application string referenced in the Web.Config</param>
        /// <returns>The value specified in the Web.Config by your applicationStringName</returns>
        public static string GetAppStringByName(string applicationStringName)
        {
            string appString = "";
            appString =  ConfigurationManager.AppSettings[applicationStringName];
            return appString;
        }

    }
}
like image 482
bulltorious Avatar asked Jan 25 '26 09:01

bulltorious


1 Answers

Refactor your classes to use the new types defined in System.Web.Abstractions. This assembly define mockable types which wrap the core (and mostly static or sealed) types that asp.net is built around. This will allow you to switch out the real runtime types with mocks in tests.