2010-02-25 109 views

回答

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); 
相關問題