I have already read some great questions and answer about this issue for example Cannot Use ConfigurationManager inside Unit Test Project
and How to mock ConfigurationManager.AppSettings with moq
For now the solution I'm using in my unit tests is as suggested an App.config file for unit test project. and it is working fine.
my goal is to dynaically load plugin (*.dll) into my C# project.
here is my original App.config
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicFormattedKeyToken=b77a5c561934e089">
<section name="IQCMain.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicFormattedKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
<section name="CalibrationToolsSection" type="sec.Calibration.Configuration.CalibrationToolsSection,sec" />
</configSections>
<CalibrationToolsSection>
<!-- This section contains the calibration tools' loading-enabling options, and versioning parameters as follows:
toolname - the calibration tool's name as returned by GetName() in ICalibrationPlugin (for static tool) or as appears in the records (for auto-gen tool)
isvisible - if set to "false" the tool will not be loaded. Deafult value: true
version - if set to "false" the tool will not be loaded. Deafult value: true /-->
<!--IpuToolCalibration-->
<IpuToolCalibrations>
<add ipu="p1">
<CalibrationToolsLoadingSettings>
<add toolname="AE" version="1" isvisible="false"/>
<add toolname="AE2" version="1" isvisible="true"/>
</CalibrationToolsLoadingSettings>
</add>
<add ipu="p2">
<CalibrationToolsLoadingSettings>
<add toolname="AE" version="1" isvisible="false"/>
<add toolname="AE2" version="1" isvisible="true"/>
</CalibrationToolsLoadingSettings>
</add>
<add ipu="p3">
<CalibrationToolsLoadingSettings>
<add toolname="AE" version="1" isvisible="false"/>
<add toolname="AE2" version="1" isvisible="true"/>
</CalibrationToolsLoadingSettings>
</add>
<add ipu="p4">
<CalibrationToolsLoadingSettings>
<add toolname="AE" version="1" isvisible="false"/>
<add toolname="AE2" version="1" isvisible="true"/>
</CalibrationToolsLoadingSettings>
<PalAteConnectivitySettings>
<add pal-uuid="1111" connect-ate="true" name="p4_wb" />
<add pal-uuid="2222" connect-ate="true" name="p4_lsc" />
<add pal-uuid="3333" connect-ate="true" name="p4_blc" />
<add pal-uuid="4343" connect-ate="true" name="p4_disparity" />
<add pal-uuid="9999" connect-ate="true" name="p4_gridbaseob" />
</PalAteConnectivitySettings>
</add>
<add ipu="p5">
<CalibrationToolsLoadingSettings>
<add toolname="ACMCmc" version="1" isvisible="true"/>
<add toolname="ACM3A" version="1" isvisible="true"/>
<add toolname="AE" version="1" isvisible="false"/>
<add toolname="AE2" version="1" isvisible="true"/>
<add toolname="llolo" version="1" isvisible="true" />
<add toolname="lalla" version="1" isvisible="true" />
</CalibrationToolsLoadingSettings>
<PalAteConnectivitySettings>
<add pal-uuid="32398" connect-ate="true" name="p5_wb" />
<add pal-uuid="53711" connect-ate="true" name="p5_lsc" />
<add pal-uuid="40661" connect-ate="true" name="p5_blc" />
<add pal-uuid="55093" connect-ate="true" name="p5_disparity" />
<add pal-uuid="46517" connect-ate="true" name="p5_gridbaseob" />
</PalAteConnectivitySettings>
</IpuToolCalibrations>
</CalibrationToolsSection>
<appSettings>
<add key="DisableCalibrationCheck" value="false" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
I saw that you can dynamically create the collections, for example
ConfigurationManager.AppSettings["mykey"] = "myvalue";
right now i'm using classes like so using System.Configuration;
namespace Manager.Calibration.Configuration
{
public class CalibrationToolsSection : ConfigurationSection
{
public static readonly string CALIBRATION_SECTION_NAME = "CalibrationToolsSection";
[ConfigurationProperty("IpuToolCalibrations")]
public IpuToolCalibrationCollection IpuToolCalibrations
{
get
{
return ((IpuToolCalibrationCollection)this["IpuToolCalibrations"]);
}
set
{
this["IpuToolCalibrations"] = value;
}
}
}
}
and also
public class IpuToolCalibrationCollection : ConfigurationElementCollection
{
public IpuToolCalibration this[int index]
{
get { return base.BaseGet(index) as IpuToolCalibration; }
set
{
if (base.BaseGet(index) != null)
{
base.BaseRemoveAt(index);
}
this.BaseAdd(index, value);
}
}
protected override ConfigurationElement CreateNewElement()
{
return new IpuToolCalibration();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((IpuToolCalibration)element).Ipu;
}
}
and so on
public class IpuToolCalibration : ConfigurationElement
{
public static readonly string IPU_TOOL_CALIBRATION_SECTION_NAME = "IpuToolCalibration";
[ConfigurationProperty("ipu", IsRequired = true)]
public string Ipu
{
get { return (string)this["ipu"]; }
set { this["ipu"] = value; }
}
[ConfigurationProperty("CalibrationToolsLoadingSettings")]
public ToolSettingElementCollection ToolsLoadingSettingsCollection
{
get
{
return ((ToolSettingElementCollection)this["CalibrationToolsLoadingSettings"]);
}
set
{
this["CalibrationToolsLoadingSettings"] = value;
}
}
[ConfigurationProperty("PalAteConnectivitySettings")]
public FilterAteConnectivityElementCollection PalAteConnectivityCollection
{
get
{
return ((FilterAteConnectivityElementCollection)this["PalAteConnectivitySettings"]);
}
set
{
this["PalAteConnectivitySettings"] = value;
}
}
}
}
Can anyone explain how can I create those from code, since they are all static classes without constructors, how am I suppose to mock them, i'm using NSubstitute. if for example i want to load part of the plugins and not all of them?