내 웹 응용 프로그램은 web.config 항목이 특정 값 (예 : FEATURE_ACTIVATED = true)에 의존하므로이 web.config 항목을 읽는 함수를 테스트하려면 어떻게해야합니까?Visual Studio 2008 - 웹 구성 설정을 이용한 단위 테스트
단위 테스트 프로젝트의 app.config 항목에 web.config 항목을 복사하지 않도록하고 싶습니다. 파일을 동기화하는 데 더 많은 노력이 필요하기 때문입니다.
내 웹 응용 프로그램은 web.config 항목이 특정 값 (예 : FEATURE_ACTIVATED = true)에 의존하므로이 web.config 항목을 읽는 함수를 테스트하려면 어떻게해야합니까?Visual Studio 2008 - 웹 구성 설정을 이용한 단위 테스트
단위 테스트 프로젝트의 app.config 항목에 web.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);