Při unit-testování se někdy ocitnete v situaci, kdy potřebujete namockovat ConfigurationSection
, resp. svého potomka. Konfigurace jsou v .NET ale celkem zapouzdřené a není úplně jednoduché překonat jejich výchozí read-only pojetí.
Nejlepší by samozřejmě bylo se od frameworkovin abstrahovat a na konfigurační data přistupovat přes nějaký adaptér, někdy ale prostě nemůžete být 100% pure (třeba musíte ConfigSection někomu dál předat), a přesto chcete nějaké pokrytí testy.
Existuje obskurní, nicméně funkční, cest, jak ConfigurationSection namockovat (případně celý konfigurační soubor, pokud je potřeba):
1. Vytvořte fake konfigurační soubor(y) ve svém testovacím projektu
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="mySection" type="MyConfigurationSection, MyAssembly" /> </configSections> <mySection> <identities> <identity clientId="fake_id" name="FAKE_NAME" partitionName="FAKE_PARTITION" permissions="Full" /> </identities> </mySection> </configuration>
Soubor může být v jakékoliv složce, nejspíš přímo vedle třídy unit-testů.
2. Nastavte, aby se .config kopíroval do výstupu buildu
V Properties souboru nastavte:
- Build Action = Content
- Copy to Output Directory = Copy always
3. Vytvořte unit-test, který tento .config souboru použije pro vytoužený fake
[TestClass] public class MyServiceTests { public TestContext TestContext { get; set; } [TestMethod] [DeploymentItem("PathInTestProject\\MyServiceTests_ScenarioName.config")] public void MyService_DoSomething_ScenarioName_ExpectedBehavior() { // arrange ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() { ExeConfigFilename = Path.Combine(TestContext.DeploymentDirectory, "MyServiceTests_ScenarioName.config") }; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); MyConfiguarionSection mySection = config.GetSection("mySection") as MyConfiguarionSection ; var sut = new MyService(mySection); // act ... } }
V čem to spočívá:
- Metoda
ConfigurationManager.OpenMappedExeConfiguration()
vás nechá načíst konfiguraci z libovolného souboru. - Atribut
[DeploymentItem(...)]
zařídí zkopírování souboru z výstupní složky buildu do „test deployment directory“ (např. $(SolutionDir)\TestResults\Deploy_username 2017-09-29 22_02_39\Out\) - Přes
TestContext.DeploymentDirectory
se dostanete na aktuální cestu složky, přičemž doTestContext
property se vám automaticky nainjectuje testovací kontext.