亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

2019-11-14 14:27:24
字體:
來源:轉載
供稿:網友

通過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對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲影院色在线观看免费| 日韩二区三区在线| 欧美日韩午夜视频在线观看| 亚洲最大成人在线| 成人网中文字幕| 国产精品欧美日韩一区二区| 欧美色另类天堂2015| 欧美乱大交xxxxx另类电影| 久久久国产视频| 久久久久国色av免费观看性色| 91久久精品久久国产性色也91| 2019中文字幕在线| 久久精品成人欧美大片古装| 91高清视频在线免费观看| 久久亚洲精品毛片| 久久综合免费视频| 欧美亚洲在线观看| 亚洲男子天堂网| 亚洲免费视频观看| 国产成人小视频在线观看| 91精品国产91久久久久久久久| 91高潮精品免费porn| 青青草成人在线| 日韩av黄色在线观看| 久久成人人人人精品欧| 韩国福利视频一区| 高清日韩电视剧大全免费播放在线观看| 亚洲最大成人网色| 国产欧美日韩丝袜精品一区| 国内揄拍国内精品少妇国语| 成人久久18免费网站图片| 亚洲精品美女在线| 国产98色在线| 亚洲大胆美女视频| 日韩www在线| 中文字幕免费国产精品| 国产精品爽爽爽爽爽爽在线观看| 在线观看国产成人av片| 国产精品视频男人的天堂| 欧美日韩亚洲一区二区三区| 精品国产91乱高清在线观看| 亚洲老头同性xxxxx| 国产午夜精品视频免费不卡69堂| 高清亚洲成在人网站天堂| 蜜月aⅴ免费一区二区三区| 草民午夜欧美限制a级福利片| 久久91亚洲人成电影网站| 国产精品国内视频| 91sao在线观看国产| 欧美在线亚洲在线| 日韩经典第一页| 国产一区二区三区在线观看网站| 欧美激情视频在线| 91久久嫩草影院一区二区| 亚洲丝袜av一区| 777777777亚洲妇女| 91精品视频网站| 国内精品一区二区三区四区| 日韩欧美国产视频| 国产精品久久久久不卡| 国产精品久久久久久婷婷天堂| 亚洲视频精品在线| 欧美重口另类videos人妖| 中文字幕国产精品久久| 黑人巨大精品欧美一区二区免费| 91成人性视频| 精品久久久久久久久久国产| 久久久人成影片一区二区三区观看| 久久久久久91香蕉国产| 中文一区二区视频| 国产网站欧美日韩免费精品在线观看| 国产亚洲一区二区在线| 69av成年福利视频| 一区二区三区视频在线| 日韩中文在线不卡| 欧美大片va欧美在线播放| 国产欧美日韩中文| 影音先锋欧美精品| 国产手机视频精品| 亚洲国产天堂久久国产91| 国产精品久久不能| 国产裸体写真av一区二区| 亚洲精品一区久久久久久| 日韩中文在线中文网三级| 91国在线精品国内播放| 日产精品久久久一区二区福利| 欧美在线亚洲在线| 久久精品中文字幕一区| 日韩av毛片网| 国产精品成人久久久久| 久久久精品一区二区| 欧美性一区二区三区| 亚洲精选中文字幕| 黑人巨大精品欧美一区二区一视频| 91超碰中文字幕久久精品| 久久久久国产精品www| 久久99精品国产99久久6尤物| 日韩欧美在线免费| 久久综合久久美利坚合众国| 96精品视频在线| 狠狠躁夜夜躁久久躁别揉| 在线a欧美视频| 久久久久久久av| 国产精品入口尤物| 日韩精品免费观看| 日韩在线免费高清视频| 日本午夜人人精品| 亚洲国产精品99久久| 国产精品亚洲激情| 欧美在线视频免费播放| 夜夜嗨av一区二区三区四区| 久久久精品视频在线观看| 亚洲欧美日韩国产成人| 91色中文字幕| 亚洲人成电影网站色| 欧美国产日韩中文字幕在线| 成人性生交大片免费看小说| 亚洲国内精品视频| 亚洲成人在线网| 亚洲午夜av电影| 国产亚洲精品91在线| 亚洲欧美精品一区| 美女性感视频久久久| 国内精品久久久久伊人av| 91美女福利视频高清| 国产成人精品一区二区三区| 日韩av观看网址| 日韩中文字幕视频在线| 久热精品视频在线观看| 9.1国产丝袜在线观看| 欧美成人激情视频免费观看| 中文字幕日韩欧美精品在线观看| 一本一本久久a久久精品综合小说| 国产成人精品久久亚洲高清不卡| 欧美黑人狂野猛交老妇| 日本一区二区三区四区视频| 国产精品久久久久av| 中文字幕亚洲欧美在线| 成人久久18免费网站图片| zzijzzij亚洲日本成熟少妇| 2019精品视频| 91爱视频在线| 成人国产精品免费视频| 亚洲激情视频网站| 欧美成人精品激情在线观看| 国产精品久久久久秋霞鲁丝| 日韩毛片在线看| 亚洲国产另类 国产精品国产免费| 国产综合在线看| 国产成人激情小视频| 成人av在线天堂| 国产91色在线|免| 久久精品亚洲国产| 黄色成人在线免费| 欧美日韩国产在线| 欧美精品情趣视频| 亚洲精品98久久久久久中文字幕| 日韩亚洲精品电影| 亚洲日本欧美日韩高观看| 成人自拍性视频| 在线视频中文亚洲| 国产精品va在线| 97久久精品人人澡人人爽缅北| 亚洲人精选亚洲人成在线|