2010-02-25 3 views
2

내 웹 응용 프로그램은 web.config 항목이 특정 값 (예 : FEATURE_ACTIVATED = true)에 의존하므로이 web.config 항목을 읽는 함수를 테스트하려면 어떻게해야합니까?Visual Studio 2008 - 웹 구성 설정을 이용한 단위 테스트

단위 테스트 프로젝트의 app.config 항목에 web.config 항목을 복사하지 않도록하고 싶습니다. 파일을 동기화하는 데 더 많은 노력이 필요하기 때문입니다.

답변

4

잡아 당겨 설정 데이터를 읽은 다음, 모의 객체와 조화 된 의존성 주입을 사용하거나 테스트에서 조롱 프레임 워크를 사용한다.

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(); 
} 
1

나는 가능한 한 이들을 피하는 것이 좋지만 때로는 다른 옵션이없는 경우가 있습니다 (특히 레거시 코드로 작업 할 때).

구성 옵션에 액세스하기위한 인터페이스를 만들 수 있습니다. 구성에 액세스하는 모든 위치에 삽입 할 수 있습니다.

그런 다음 기본 구현 클래스 인 내장 된 구성 클래스에이를 위임하는 구체적인 클래스를 구현합니다.

시험용 인터페이스의 모의 구현을 만들고 테스트 할 때이를 주입하십시오.

1

필자는 시스템을 테스트하는 동안 구성을 대체 (모의) 할 수 있도록 항상 구성 논리를 래핑합니다. 즉

, 정말처럼 내 구성을 포장 : 시스템이 테스트중인 경우

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); 
관련 문제