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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品720p| 亚洲美女又黄又爽在线观看| 国内精久久久久久久久久人| 欧美成人sm免费视频| 丁香五六月婷婷久久激情| 中文字幕国产亚洲2019| 欧美激情中文字幕在线| 欧美视频裸体精品| 日本不卡免费高清视频| 97视频人免费观看| 第一福利永久视频精品| 亚洲xxxx18| 亚洲精品电影网| 亚洲图片在线综合| 欧美高清视频在线观看| 影音先锋欧美精品| 91伊人影院在线播放| 一区国产精品视频| 国产成人精品a视频一区www| 97精品久久久中文字幕免费| 久久成人在线视频| 国产日产欧美精品| 国产欧美va欧美va香蕉在| 色偷偷噜噜噜亚洲男人| 亚洲一区二区久久| 日韩电影中文 亚洲精品乱码| 精品国产区一区二区三区在线观看| 亚洲国产天堂久久国产91| 亚洲免费高清视频| 激情av一区二区| 国产精品久久久久影院日本| 亚洲欧美日韩国产成人| 欧洲中文字幕国产精品| 亚洲国产精品久久久久久| 中文字幕在线日韩| 一个色综合导航| 亚洲性日韩精品一区二区| 亚洲欧美自拍一区| 久久99国产综合精品女同| 国产精品99久久99久久久二8| 国产suv精品一区二区| 欧美性猛交xxxx乱大交极品| 欧美与欧洲交xxxx免费观看| 91在线观看免费观看| 国产一区二区美女视频| 亚洲人成电影在线| 久久久久久久影院| 欧美性理论片在线观看片免费| 亚洲国产美女精品久久久久∴| 俺去了亚洲欧美日韩| 亚洲qvod图片区电影| 亚洲免费视频在线观看| 欧美特黄级在线| 亚洲区一区二区| 日韩在线视频导航| 97国产精品视频人人做人人爱| 日韩国产在线看| 高清一区二区三区日本久| 欧美日韩免费在线| 亚洲国产精品大全| 搡老女人一区二区三区视频tv| 亚洲18私人小影院| 在线视频欧美性高潮| 国产精品啪视频| 91精品综合久久久久久五月天| 色爱精品视频一区| 欧美亚洲一区在线| 日韩精品视频免费专区在线播放| 亚洲国产成人精品一区二区| 欧美电影在线观看高清| 国产日韩欧美一二三区| 91久久精品在线| 欧美日韩国产成人在线| 亚洲xxxx在线| 97av视频在线| 精品国产一区二区三区久久狼5月| 自拍视频国产精品| 久久久久一本一区二区青青蜜月| 久久久久久久久综合| 一区二区三区 在线观看视| 国产精品夜间视频香蕉| 日韩高清中文字幕| 欧美精品videossex性护士| 久热99视频在线观看| 国产成人avxxxxx在线看| 国产999精品久久久| 亚洲国产精品悠悠久久琪琪| 国产成人高清激情视频在线观看| 97福利一区二区| 国内伊人久久久久久网站视频| 欧洲美女7788成人免费视频| 91视频-88av| 亚洲欧洲国产伦综合| 日本久久亚洲电影| 久久久国产精品亚洲一区| 91久久精品日日躁夜夜躁国产| 国内精品一区二区三区四区| 啊v视频在线一区二区三区| 国产成人精品综合久久久| 国产成人激情小视频| 98精品在线视频| 久久精彩免费视频| 欧美极品少妇xxxxⅹ裸体艺术| 久久亚洲精品视频| 亚洲欧美另类在线观看| 亚洲人成绝费网站色www| 91高清视频在线免费观看| 亚洲欧美三级在线| 国产精品亚洲第一区| 欧美激情在线视频二区| zzijzzij亚洲日本成熟少妇| 清纯唯美亚洲综合| 成人精品aaaa网站| 中文字幕亚洲天堂| 国产小视频国产精品| 精品国产一区av| 91爱爱小视频k| 久久国产精品免费视频| 不用播放器成人网| 亚洲成色777777在线观看影院| www.国产精品一二区| 欧美一级黑人aaaaaaa做受| 欧美日韩裸体免费视频| 亚洲欧美激情在线视频| 乱亲女秽乱长久久久| 日韩欧美成人网| 91色p视频在线| 91久久久久久久久久| 亚州精品天堂中文字幕| 日韩精品视频免费| 亚洲欧美日韩天堂一区二区| 日本国产高清不卡| 国产精品久久久久免费a∨大胸| 欧美激情一区二区三区久久久| 欧美成在线视频| 亚洲欧美一区二区三区四区| 亚洲人成电影在线| 亚州成人av在线| 久久精品最新地址| 国产日韩欧美电影在线观看| 亚洲综合精品一区二区| 日本精品性网站在线观看| 亚洲在线免费视频| 亚洲美女性生活视频| 欧美俄罗斯性视频| 91久久国产综合久久91精品网站| 伊人av综合网| 久久精品国产亚洲| 欧美日韩视频在线| 久久久久久com| 国产综合色香蕉精品| 亚洲国产精品国自产拍av秋霞| 国产在线观看精品一区二区三区| 亚洲综合av影视| 91精品国产精品| 色午夜这里只有精品| 欧美性猛交xxxxx水多| 国产日韩综合一区二区性色av| 亚洲a区在线视频| 91社影院在线观看| 亚洲va久久久噜噜噜| 国产精品视频精品| 欧美日韩国产中文精品字幕自在自线| 97人人模人人爽人人喊中文字|