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.DeploymentDirectoryse dostanete na aktuální cestu složky, přičemž doTestContextproperty se vám automaticky nainjectuje testovací kontext.