How to unit test a config file, (ConfigurationSection)
To unit test a ConfigurationSection in c# you need to do a couple of thing in your unit test
Of course, we do not want to change anything in the assembly being tested.
- Create your own ConfigurationSection class
- ‘Fake’ your own configuration file.
- Test that you have the expected behaviour
- For required values
- Optional values
In your test application, create your own configuration loader class
It uses your configuration section as a template.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
internal class Loader where T : ConfigurationSection { // The filename that will contain the test contents. private string _fileName; // the instance we are testing public T Instance { get; } // the section we want to 'test' as well as the complete fake content public Loader(string section, string content) { File.WriteAllText(FileName, content); if (File.Exists(FileName)) { var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = FileName }; var config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None, true); Instance = config.GetSection(section) as T; } } |
Of course we also need to clean up things a little.
The file we created needs to be removed, you could also have this in your test teardown.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
~Loader() { if (_fileName != null) { try { File.Delete(_fileName); } catch { // it will get deleted at some other point. // as it is a temp file the OS will/should remove ut } _fileName = null; } } |
Creating the fake test file.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private string FileName { get { if (_fileName != null) { return _fileName; } _fileName = Path.GetTempPath() + Guid.NewGuid() + ".config"; return _fileName; } } } |
Now testing the config is fairly straight forward, (using NUnit in this case)
(using the sample config content, my parser does not escape it properl)
<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
<configSections>
<section name=""blah"" type=""BlahConfiguration,MyApp.Blah"" />
</configSections>
<blah>
</blah>
</configuration>
1 2 3 4 5 6 7 8 9 10 |
// in this example BlahConfiguration allows no values public void SectionCanBeEmpty() { // sample configuration file. const string content = // see content above; Loader<BlahConfiguration> cl = null; Assert.DoesNotThrow( () => cl = new ConfigLoader<BlahConfiguration>("blah", content)); Assert.That( cl.Instance.Strings.Count == 0 ); } |
So now you can create your tests and just pass the values you want to test, default values for example, that values are loaded properly and so on.
Recent Comments