我的web應用程序依賴於web.config條目是一個特定的值(如FEATURE_ACTIVATED = true),所以如何測試讀取此web.config條目的函數?Visual Studio 2008 - 使用web配置設置進行單元測試
我想避免將web.config條目複製到單元測試項目中的app.config,因爲它需要額外的努力來同步文件。
我的web應用程序依賴於web.config條目是一個特定的值(如FEATURE_ACTIVATED = true),所以如何測試讀取此web.config條目的函數?Visual Studio 2008 - 使用web配置設置進行單元測試
我想避免將web.config條目複製到單元測試項目中的app.config,因爲它需要額外的努力來同步文件。
拉出讀取配置數據的代碼,然後在測試中使用依賴注入與模擬對象或模擬框架配對。
public interface IConfiguration
{
bool IsAwesomeFeatureActivated { get; }
}
public class Configuration: IConfiguration
{
public bool IsAwesomeFeatureActivated
{
get { /* get config value */ }
}
}
public class AwesomeFeature
{
private IConfiguration _configuration;
public AwesomeFeature(IConfiguration configuration)
{
_configuration = configuration;
}
public void ExecuteFeature()
{
if(! _configuration.IsAwesomeFeatureActivated) return;
// do awesome feature functionality
}
}
public class MockConfiguration: IConfiguration
{
private bool _isAwesomeFeatureActivated;
public void SetIsAwesomeFeatureEnabled(bool value)
{
_isAwesomeFeatureActivated = value;
}
public bool IsAwesomeFeatureActivated
{
get { return _isAwesomeFeatureActivated; }
}
}
// with mock object
[Test]
public void ExecuteFeature_WhenNotActivated_DoNothing()
{
var mockConfig = new MockConfiguration();
mockConfig.SetIsAwesomeFeatureActivated(false);
var feature = new AwesomeFeature(mockConfig);
feature.ExecuteFeature();
Assert.SomethingHere();
}
// or with Moq framework
[Test]
public void ExecuteFeature_WithActivated_DoSomething()
{
var mock = new Mock<IConfiguration>();
mock.Setup(c => c.IsAwesomeFeatureActivated).Returns(true);
var feature = new AwesomeFeature(mock.Object);
feature.ExecuteFeature();
Assert.SomethingHere();
}
我也喜歡在可能的情況下避免這些,但有時候沒有其他選項(特別是使用遺留代碼時)。
您可以在哪裏創建一個用於訪問配置選項的界面 - 將它注入到您正在訪問的配置的任何位置。
然後實現一個具體類,將其委託給內置的配置類,這是使用的默認實現。
爲測試創建接口的模擬實現,並在測試時注入接口。
我總是包裝配置邏輯,以便在系統正在測試時替換(模擬)配置。
換句話說,我總結我的配置如下所示:
public interface IConfigurationSettings
{
string SmtpHost { get; }
}
public class ConfigurationSettings : IConfigurationSettings
{
public string SmtpHost
{
get { return ConfigurationManager.AppSettings["SmtpHost"]; }
}
}
public static class Settings
{
private static readonly IConfigurationSettings _configurationSettings;
static Settings()
{
_configurationSettings = IoCHelper.Resolve<IConfigurationSettings>();
}
public static string SmtpHost
{
get { return _configurationSettings.SmtpHost; }
}
}
然後,當系統處於測試中,我可以模擬出我的配置如下所示:
var settings = new Mock<IConfigurationSettings>();
settings.SetupGet(s => s.SmtpHost).Returns("127.0.0.1");
Resolver.Setup(r => r.Resolve<IConfigurationSettings>()).Returns(settings.Object);