麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

ASP.NET系列:單元測試之ConfigurationManager

2019-11-14 14:15:57
字體:
來源:轉載
供稿:網友

通過ConfigurationManager使用.NET配置文件時,可以通過添加配置文件進行單元測試,雖然可以通過測試但達不到解耦的目的。使用IConfigurationManager和ConfigurationManagerWrapper對ConfigurationManager進行適配是更好的方式,ConfigurationManagerWrapper提供.NET配置文件方式的實現,如果需要支持其他配置,創建IConfigurationManager接口的不同的實現類即可。

1.定義IConfigurationManager接口

原本依賴ConfigurationManager的代碼現在依賴IConfigurationManager??梢栽趩卧獪y試時方便的Mock。

public interface IConfigurationManager{    NameValueCollection AppSettings { get; }    ConnectionStringSettingsCollection ConnectionStrings { get; }    object GetSection(string sectionName);}

2.創建適配類ConfigurationManagerWrapper

非單元測試環境使用ConfigurationManagerWrapper作為IConfigurationManager的默認實現。

public class ConfigurationManagerWrapper : IConfigurationManager{    public NameValueCollection AppSettings    {        get        {            return ConfigurationManager.AppSettings;        }    }    public ConnectionStringSettingsCollection ConnectionStrings    {        get        {            return ConfigurationManager.ConnectionStrings;        }    }    public object GetSection(string sectionName)    {        return ConfigurationManager.GetSection(sectionName);    }}

3.自定義泛型配置接口

在我們的代碼需要使用配置時,可以考慮創建通用的泛型接口也可以使用專用的強類型的接口。這里演示使用通用的接口。

public interface IConfiguration{    T Get<T>(string key, T @default);}

4.實現泛型接口配置接口的.NET配置文件版本

AppConfigAdapter直接不使用ConfigurationManager而是依賴IConfigurationManager接口。

public class AppConfigAdapter : IConfiguration{    PRivate IConfigurationManager _configurationManager;    public AppConfigAdapter(IConfigurationManager configurationManager)    {        this._configurationManager = configurationManager;    }    public T Get<T>(string nodeName, T @default)    {        var value = this._configurationManager.AppSettings[nodeName];        return value == null ? @default : (T)Convert.ChangeType(value, typeof(T));    }}

5.對泛型配置接口的實現進行單元測試

使用最流行的單元測試框架和Mock類庫:xUnit+Moq進行單元測試。

public class AppConfigAdapterTest{    [Fact]    public void GetStringTest()    {        var key = "key";        var value = "value";        var configuration = new AppConfigAdapter(this.GetConfigurationManager(o => o.Add(key, value.ToString())));        Assert.Equal(configuration.Get(key, string.Empty), value);    }    [Fact]    public void GetIntTest()    {        var key = "key";        var value = 1;        var configuration = new AppConfigAdapter(this.GetConfigurationManager(o => o.Add(key, value.ToString())));        Assert.Equal(configuration.Get(key, int.MinValue), value);    }    [Fact]    public void GetBoolTest()    {        var key = "key";        var value = true;        var configuration = new AppConfigAdapter(this.GetConfigurationManager(o => o.Add(key, value.ToString())));        Assert.Equal(configuration.Get(key, false), value);    }    [Fact]    public void GetDateTimeTest()    {        var key = "key";        var value = DateTime.Parse(DateTime.Now.ToString());        var configuration = new AppConfigAdapter(this.GetConfigurationManager(o => o.Add(key, value.ToString())));        Assert.Equal(configuration.Get(key, DateTime.MinValue), value);    }    [Fact]    public void GetDecimalTest()    {        var key = "key";        var value = 1.1m;        var configuration = new AppConfigAdapter(this.GetConfigurationManager(o => o.Add(key, value.ToString())));        Assert.Equal(configuration.Get(key, decimal.MinValue), value);    }    private IConfigurationManager GetConfigurationManager(Action<NameValueCollection> set)    {        var appSettings = new NameValueCollection();        set(appSettings);        var configurationManager = new Mock<IConfigurationManager>();        configurationManager.Setup(o => o.AppSettings).Returns(appSettings);        return configurationManager.Object;    }}

運行結果:

6.總結

使依賴ConfigurationManager靜態類的代碼轉換為依賴IConfigurationManager接口,運行時注入ConfigurationManagerWrapper實現類。單元測試時使用Mock模擬IConfigurationManager對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻豆传传媒久久久爱 | 成人一级黄色大片 | 免费国产自久久久久三四区久久 | 久久久久电影网站 | 国产精品99久久久久久久vr | 成年免费视频黄网站在线观看 | 欧美一级毛片一级毛片 | 午夜视频在线观看免费视频 | 亚洲91精品 | 亚洲国产精品久久久久久久久久久 | 91精品国产91热久久久做人人 | 亚洲一级成人 | 全免费午夜一级毛片真人 | 12av毛片 | 久久精品欧美视频 | 亚洲成人激情在线 | 成人一级在线 | 91久久精品一二三区 | 99精品视频一区二区三区 | 精品在线免费播放 | 久久久久久久99 | 欧美亚洲一级 | 免费毛片小视频 | 99国产精品欲a | 亚洲视频在线免费看 | 久久国产28 | 毛片在线免费观看网址 | 91精品国产乱码久久桃 | 久久综合久久美利坚合众国 | 毛片视频网站 | 99亚洲视频| 久久精品4 | 国产毛片在线高清视频 | 操操操操网 | 欧美日韩精品中文字幕 | 亚洲国产精品久久久久制服红楼梦 | 经典三级av在线 | 一级做受毛片免费大片 | 色婷婷久久一区二区 | 久久久激情网 | 精品国产96亚洲一区二区三区 |