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ž do TestContext
property se vám automaticky nainjectuje testovací kontext.
Líbí se mi to:
Líbí Načítání...