<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_gossip</title><subtitle type="text">qq群:74085440  欢迎加入，专注于微软平台开发，主要是Asp.net</subtitle><id>http://feed.cnblogs.com/blog/u/38721/rss</id><updated>2012-05-28T09:17:52Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/38721/rss"/><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/26/2519312.html</id><title type="text">AspnetMvc实现无刷新省市联动功能</title><summary type="text">1、Control层 /// &lt;summary&gt; /// action方法根据省份编号返回json形式的城市信息 /// &lt;/summary&gt; /// &lt;param name="p"&gt;省份编号&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; public ActionResult GetCit...</summary><published>2012-05-26T07:51:00Z</published><updated>2012-05-26T07:51:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/26/2519312.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/26/2519312.html"/><content type="html">&lt;p&gt;&lt;font color="#ff0000"&gt;1、Control层     &lt;br /&gt;      &lt;font color="#000000"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// action方法根据省份编号返回json形式的城市信息&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name=&amp;quot;p&amp;quot;&amp;gt;省份编号&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;        public ActionResult GetCityList(string p)&lt;br/&gt;        {&lt;br/&gt;          ;&lt;br/&gt;            IList&amp;lt;City&amp;gt; cityModelList =//根据省份编号返回城市信息&lt;br/&gt;            var pList = new SelectList(cityModelList, &amp;quot;CityId&amp;quot;, &amp;quot;CityName&amp;quot;);&lt;br/&gt; &lt;br/&gt;            return Json(pList, JsonRequestBehavior.AllowGet);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;      //绑定省份信息&lt;br/&gt;      public void BindProvince(string defaultText = &amp;quot;请选择&amp;quot;, string defaultValue = &amp;quot;&amp;quot;)&lt;br/&gt;        {&lt;br/&gt;            var dt =// 省份信息&lt;br/&gt;            IList&amp;lt;SelectListItem&amp;gt; items = new List&amp;lt;SelectListItem&amp;gt;();&lt;br/&gt;            items.Add(new SelectListItem { Text = defaultText, Value = &amp;quot;&amp;quot;, Selected = true });&lt;br/&gt;            foreach (var dr in dt)&lt;br/&gt;            {&lt;br/&gt;                items.Add(new SelectListItem { Text = dr.ProvinceName, Value = dr.ProvinceCode });&lt;br/&gt;            }&lt;br/&gt;            this.controller.ViewData[&amp;quot;Province&amp;quot;] = items;&lt;br/&gt;            this.controller.ViewData[&amp;quot;ddlProvince&amp;quot;] = defaultValue ?? string.Empty;&lt;br/&gt;        }&lt;br/&gt;       //绑定省市信息&lt;br/&gt;        public void BindCity(string provinceId, string defaultText = &amp;quot;请选择&amp;quot;, string defaultValue = &amp;quot;&amp;quot;)&lt;br/&gt;        {&lt;br/&gt;            IList&amp;lt;SelectListItem&amp;gt; items = new List&amp;lt;SelectListItem&amp;gt;();&lt;br/&gt;            if (provinceId == string.Empty)&lt;br/&gt;            {&lt;br/&gt;                items.Add(new SelectListItem { Text = defaultText, Value = defaultValue });&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                var dt = //根据省份编号获取城市信息&lt;br/&gt;                foreach (var dr in dt)&lt;br/&gt;                {&lt;br/&gt;                    items.Add(new SelectListItem { Text = dr.CityName, Value = dr.CityId });&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt; &lt;br/&gt;            this.controller.ViewData[&amp;quot;City&amp;quot;] = items;&lt;br/&gt;            this.controller.ViewData[&amp;quot;ddlCity&amp;quot;] = defaultValue ?? string.Empty;&lt;br/&gt;        }&lt;/font&gt;    &lt;font color="#ff0000"&gt;2、View层&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;font color="#000000"&gt;&amp;lt;script src=&amp;quot;@Url.Content(&amp;quot;~/Scripts/provinceCity.js&amp;quot;)&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;div class=&amp;quot;editor-label&amp;quot;&amp;gt;&lt;br/&gt;            省份城市&lt;br/&gt;        &amp;lt;/div&amp;gt;&lt;br/&gt;        &amp;lt;div&amp;gt;&lt;br/&gt;            @Html.DropDownList(&amp;quot;ddlProvince&amp;quot;, ViewData[&amp;quot;Province&amp;quot;] as IEnumerable&amp;lt;SelectListItem&amp;gt;)&lt;br/&gt;            @Html.DropDownList(&amp;quot;ddlCity&amp;quot;, ViewData[&amp;quot;City&amp;quot;] as IEnumerable&amp;lt;SelectListItem&amp;gt;)&lt;br/&gt;            @Html.ValidationMessageFor(model =&amp;gt; model.CityId)&lt;br/&gt;        &amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    //隐藏字段用于在js调用，设置url路径 &lt;br/&gt;    @Html.Hidden(&amp;quot;GetCityList&amp;quot;, Url.Action(&amp;quot;GetCityList&amp;quot;, &amp;quot;Enterprise&amp;quot;))&lt;/font&gt; &lt;br/&gt;3、Js代码&lt;br /&gt;&lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(document).ready(function () {&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#ddlProvince&amp;quot;).change(function () { getCity($(this).val()); });&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function getCity(provinveCode) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#ddlCity&amp;quot;).html(&amp;quot;&amp;quot;); //清空&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.ajax({&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type: &amp;quot;GET&amp;quot;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; url: $(&amp;quot;#GetCityList&amp;quot;).val(),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data: &amp;quot;p=&amp;quot; + provinveCode + &amp;quot;&amp;amp;date=&amp;quot; + new Date(),&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataType: &amp;quot;json&amp;quot;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; success: function (json) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (json.length &amp;gt; 0) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i = 0; i &amp;lt; json.length; i++) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#ddlCity&amp;quot;).append(&amp;quot;&amp;lt;option value='&amp;quot; + json[i].Value + &amp;quot;'&amp;gt;&amp;quot; + json[i].Text + &amp;quot;&amp;lt;/option&amp;gt;&amp;quot;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#ddlCity&amp;quot;).append(&amp;quot;&amp;lt;option value=''&amp;gt;请选择&amp;lt;/option&amp;gt;&amp;quot;);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; },&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; error: function (data) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; alert(data);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;});&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/pre&gt;  &lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2519312.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/26/2519312.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/26/2519289.html</id><title type="text">使用Moq模拟AspnetMvc中的Request.Form</title><summary type="text">1、比如Request.Form["ddlType"]为control中需要模拟的内容 2、在单元测试中调用的代码（使用的是VS2010自带的单元测试框架） var request = new Mock&lt;HttpRequestBase&gt;(); //request.Setup(r =&gt; r.HttpMethod).Returns("Post"); //这里Post和Get都行，可不添加此行代码 //request.Setup(r =&gt; r.PathInfo).Returns(string.Empty);//可不添加此行代码 ...</summary><published>2012-05-26T07:27:00Z</published><updated>2012-05-26T07:27:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/26/2519289.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/26/2519289.html"/><content type="html">&lt;p&gt;1、比如Request.Form["ddlType"]为control中需要模拟的内容&lt;/p&gt;  &lt;p&gt;2、在单元测试中调用的代码（使用的是VS2010自带的单元测试框架）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;         var request = new Mock&amp;lt;HttpRequestBase&amp;gt;();&lt;br/&gt;            //request.Setup(r =&amp;gt; r.HttpMethod).Returns("Post"); //这里Post和Get都行，可不添加此行代码&lt;br/&gt;            //request.Setup(r =&amp;gt; r.PathInfo).Returns(string.Empty);//可不添加此行代码&lt;br/&gt; &lt;br/&gt;            //需要模拟的Request.Form键值对&lt;br/&gt;            var formvalues = new NameValueCollection { { "ddlType1", model.ddlType1}, { "ddlType2", model.ddlType2 } };&lt;br/&gt; &lt;br/&gt;            var mockHttpContext = new Mock&amp;lt;HttpContextBase&amp;gt;();&lt;br/&gt;            mockHttpContext.Setup(c =&amp;gt; c.Request).Returns(request.Object);&lt;br/&gt;            mockHttpContext.Setup(c =&amp;gt; c.Request.Form).Returns(formvalues);&lt;br/&gt;&lt;br/&gt;            Mock&amp;lt;EnterpriseRepository&amp;gt; mockEnterprise = new Mock&amp;lt;EnterpriseRepository&amp;gt;();&lt;br/&gt;            EnterpriseController controller = new EnterpriseController(mockEnterprise.Object); //Control&lt;br/&gt;            var context = new ControllerContext(mockHttpContext.Object, new RouteData(), controller);&lt;br/&gt;&lt;br/&gt;            controller.ControllerContext = context;  //设置control的context熟悉&lt;br/&gt;           var result = controller.Create(model); //调用action方法 &lt;img src="http://www.cnblogs.com/gossip/aggbug/2519289.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/26/2519289.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/23/2514730.html</id><title type="text">配置文件操作类</title><summary type="text">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;namespace ConsoleApplication1{ /// &lt;summary&gt; /// 配置文件工具类 /// &lt;/summary&gt; public static class ConfigUtil { /// &lt;summary&gt; /// 修改Config配置文件的值 /// &lt;/summary&gt; /// &lt;...</summary><published>2012-05-23T06:14:00Z</published><updated>2012-05-23T06:14:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/23/2514730.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/23/2514730.html"/><content type="html">using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;using System.Xml;&lt;br/&gt;&lt;br/&gt;namespace ConsoleApplication1&lt;br/&gt;{&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// 配置文件工具类&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    public static class ConfigUtil&lt;br/&gt;    {&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 修改Config配置文件的值&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="filePath"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="newValue"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        public static void SetAppSettingsExe(string filePath, string key, string newValue)&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                var doc = new XmlDocument();&lt;br/&gt;                doc.Load(filePath);&lt;br/&gt;&lt;br/&gt;                doc.SelectSingleNode("/configuration/appSettings/add[@key='" + key + "']").Attributes["value"].Value = newValue;&lt;br/&gt;                doc.Save(filePath);&lt;br/&gt;                doc.Load(filePath);&lt;br/&gt;                doc = null;&lt;br/&gt;            }&lt;br/&gt;            catch (Exception ex)&lt;br/&gt;            {&lt;br/&gt;                throw ex;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 获取Config配置文件的值&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="filePath"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        public static string GetAppSettingsExe(string filePath, string key)&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                var doc = new XmlDocument();&lt;br/&gt;                doc.Load(filePath);&lt;br/&gt;                return doc.SelectSingleNode("/configuration/appSettings/add[@key='" + key + "']").Attributes["value"].Value;&lt;br/&gt;            }&lt;br/&gt;            catch (Exception ex)&lt;br/&gt;            {&lt;br/&gt;                throw ex;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 修改vshost.exe.Config配置文件的值&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="value"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        public static void SetAppSettingsVshostExe(string key, string value)&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                //vshost.exe.Config&lt;br/&gt;                var doc = new XmlDocument();&lt;br/&gt;                doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);&lt;br/&gt;&lt;br/&gt;                doc.SelectSingleNode("/configuration/appSettings/add[@key='" + key + "']").Attributes["value"].Value = value;&lt;br/&gt;&lt;br/&gt;                doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);&lt;br/&gt;            }&lt;br/&gt;            catch (Exception ex)&lt;br/&gt;            {&lt;br/&gt;                throw ex;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 获取vshost.exe.Config配置文件的值&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="key"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;        public static string GetAppSettingsVshostExe(string key)&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                var doc = new XmlDocument();&lt;br/&gt;                doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);&lt;br/&gt;                return doc.SelectSingleNode("/configuration/appSettings/add[@key='" + key + "']").Attributes["value"].Value;&lt;br/&gt;            }&lt;br/&gt;            catch (Exception ex)&lt;br/&gt;            {&lt;br/&gt;                throw ex;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;调用：&lt;/p&gt;       ConfigUtil.SetAppSettingsVshostExe("aa123", "你们");&lt;br/&gt;            var v = ConfigUtil.GetAppSettingsExe(@"E:\项目\ConsoleApplication1\app.config", "aa");&lt;br/&gt;            var v2 = ConfigUtil.GetAppSettingsVshostExe("aa");&lt;br/&gt;            ConfigUtil.SetAppSettingsExe(@"E:\项目\ConsoleApplication1\app.config", "aa", "马"); &lt;img src="http://www.cnblogs.com/gossip/aggbug/2514730.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/23/2514730.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/21/2511444.html</id><title type="text">软件工程师在外企学什么？</title><summary type="text">原文链接：http://blog.csdn.net/hzliyun/article/details/7564096。我在Motorola工作了近6年（注：在这期间我经历了Motorola拆分成Motorola Solutions和Motorola Mobility，以及Motorola Solutions将网络部门卖给NSN，期间我所在团队的企业文化和工作环境一直沿用的是原Motorola的），经历了从开发工程师到架构师的成长历程，在此分享一下软件工程师在Motorola这样的外企应学些什么。首先，由于外企的工作语言是外语，因此掌握外语是必须的。在Motorola这样的外企工作，英语不光要求.</summary><published>2012-05-21T04:10:00Z</published><updated>2012-05-21T04:10:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/21/2511444.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/21/2511444.html"/><content type="html"> &lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;&lt;span style='margin: 0px; padding: 0px; color: rgb(114, 41, 50); line-height: 28px; font-family: 宋体,"Arial Narrow",arial,serif;'&gt;&lt;span style='color: rgb(0, 0, 0); line-height: normal; font-family: "Times New Roman"; font-size: 18px;'&gt;原文链接：&lt;/span&gt;&lt;/span&gt;&lt;span style='color: rgb(114, 41, 50); font-family: 宋体,"Arial Narrow",arial,serif; font-size: 18px;'&gt;&lt;span style="line-height: 28px;"&gt;&lt;a class="smarterwiki-linkify" href="http://blog.chinaunix.net/uid-26470037-id-3206670.html"&gt;&lt;/a&gt;&lt;a href="http://blog.csdn.net/hzliyun/article/details/7564096"&gt;http://blog.csdn.net/hzliyun/article/details/7564096&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='color: rgb(114, 41, 50); line-height: 28px; font-family: 宋体,"Arial Narrow",arial,serif; font-size: 18px;'&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;我在Motorola工作了近6年（注：在这期间我经历了Motorola拆分成Motorola Solutions和Motorola Mobility，以及Motorola Solutions将网络部门卖给NSN，期间我所在团队的企业文化和工作环境一直沿用的是原Motorola的），经历了从开发工程师到架构师的成长历程，在此分享一下软件工程师在Motorola这样的外企应学些什么。&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;首先，由于外企的工作语言是外语，因此掌握外语是必须的。在Motorola这样的外企工作，英语不光要求会看和写，而且要听和说都行。外语对于一线工程师来说要求相对弱一点，因为除了出国和平时与外国同事开会外运用听和写技能的机会少得多。由于架构师这样的职位经常要与国外的同事沟通，对英语的要求就高多了，甚至要做到能用英语去争论。对于希望进入外企的工程师来说，早点练好外语会取得一定的优势，除了能争取到更多的出国机会外，还容易在外国同事面前展示自己。可以毫不夸张地说，英语水平决定了在外企职业发展的&amp;#8220;天花板&amp;#8221;。&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;其次，在外企得学习西式沟通。与中式沟通的含蓄不同的是，西式的沟通更加的直接，更加讲究逻辑。在与美国同事打交道的过程中我发现，工作进展与原计划出现偏差并不是什么可怕的事，你只要能直接地告诉他为什么会出现这样的偏差，逻辑能讲得通就不会是问题。另外，外国同行很喜欢我们问问题，他们最害怕的是我们没有问题，一声不吭。由于中国工程师在表达方面表现得不积极，使得我们有时给人的感觉是&amp;#8220;难以琢磨&amp;#8221;。国人的这种表现，与英语水平有一点关系，但我觉得更多是因为我们缺乏沟通的意识。&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;再次，学习专业做事是重中之重。由于西方人做事更加的讲逻辑和规则，因此他们做事通常会显得更专业，这与国人的&amp;#8220;只要将事情做出来&amp;#8221;的思想形成很鲜明的反差。专业做事体现在几个方面。其一，使用合适的工具。国人做事更多的是不管什么事都用&amp;#8220;榔头&amp;#8221;去做，与之不同的是外国同行会使用各种合适的工具，这一点美国和俄罗斯的同事明显高于我们，他们的技能多元化水平比我们高。其二，文档化。西方的同事更具&amp;#8220;人人为我，我为人人&amp;#8221;的精神，因此他们更注重通过文档的方式将所碰到的问题和解决方案记录下来与人分享。相比之下，中国的工程师更多的是采用&amp;#8220;小金库&amp;#8221;的形式，分享起来有的还遮遮掩掩。将知识和经验文档化需要的不只是意识，还对写作能力做了更高的要求。其三，遵守和改进流程。外国同事相对&amp;#8220;死脑筋&amp;#8221;，他们做事很看重流程。一说到流程国人的感觉很可能是反感，因为我们做事更加主张&amp;#8220;无政府主义&amp;#8221;、&amp;#8220;凡事只要能做完就行了&amp;#8221;，这种思想在外企很容易碰壁。&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style='font-family: "Times New Roman"; font-size: 14px;'&gt;&lt;span style="font-size: 18px;"&gt;又次，学习流程不可小视。有同仁可能会想&amp;#8220;流程有什么好学的，跟着做一遍不就会了吗？&amp;#8221;此言差矣！如果关注流程外在的&amp;#8220;形&amp;#8221;会认为它很简单，如果关注&amp;#8220;形&amp;#8221;背后的&amp;#8220;神&amp;#8221;你会发现其中的知识非常丰富，蕴涵了外企是如何运作一个大型研发项目的。流程的好处，不只是引导我们做完事，更是规范我们的行为和帮助培养工作习惯，这一点我相信国人相对缺乏深刻的认识。如果在外企工作但却没有深刻地认识流程，那我会对你说&amp;#8220;你白在外企干过了！&amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2511444.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/21/2511444.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/16/2503477.html</id><title type="text">Moq基础教程</title><summary type="text">1 基础概念 集中精力开发业务逻辑部分，而不想在数据层上花费太多时间，这时，可以通过Mock对象来模拟数据层，而不必去为数据连接，CRUD，Mapping等等去做太多的事，而又可以使业务测试可以进行下去 2 教程及下载地址 http://code.google.com/p/moq/ http://www.codethinked.com/beginning-mocking-with-moq-...</summary><published>2012-05-16T02:03:00Z</published><updated>2012-05-16T02:03:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/16/2503477.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/16/2503477.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1 基础概念&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;集中精力开发业务逻辑部分，而不想在数据层上花费太多时间，这时，可以通过Mock对象来模拟数据层，而不必去为数据连接，CRUD，Mapping等等去做太多的事，而又可以使业务测试可以进行下去&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2 教程及下载地址&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/moq/"&gt;http://code.google.com/p/moq/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codethinked.com/beginning-mocking-with-moq-3-part-1"&gt;http://www.codethinked.com/beginning-mocking-with-moq-3-part-1&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;http://www.cnblogs.com/jams742003/archive/2010/03/02/1676215.html&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3 一个Demo&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;//接口   &lt;br /&gt;public interface ICustomer &lt;/p&gt;  &lt;p&gt;{ &lt;/p&gt;  &lt;p&gt;void AddCall();&lt;/p&gt;  &lt;p&gt;string GetCall();&lt;/p&gt;  &lt;p&gt;string GetCall(string strUser);&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160; }&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&amp;#160;&amp;#160;&amp;#160; //建立Mock对象&lt;/p&gt;  &lt;p&gt;//设置mock调用行为&lt;/p&gt;  &lt;p&gt;customer.Setup(p=&amp;gt;p.AddCall());&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall()).Returns(&amp;quot;phone:89898789&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall(&amp;quot;Tom&amp;quot;)).Returns(&amp;quot;Hello&amp;quot;);&lt;/p&gt;  &lt;p&gt;//使用mock调用方法&lt;/p&gt;  &lt;p&gt;customer.Object.AddCall();&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(&amp;quot;phone:89898789&amp;quot;, customer.Object.GetCall());&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(&amp;quot;Hello&amp;quot;, customer.Object.GetCall(&amp;quot;Tom&amp;quot;));&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4 功能点介绍&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.1 &lt;/b&gt;&lt;b&gt;带有引用或输出参数的方法&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;string GetAddress(string strUser, out string Address);&lt;/p&gt;  &lt;p&gt;string GetFamilyCall(ref string strUser);&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;var outString=&amp;quot;oo&amp;quot;;&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetAddress(&amp;quot;&amp;quot;, out outString)).Returns(&amp;quot;shijiazhuang&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetFamilyCall(ref outString)).Returns(&amp;quot;xx&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.2 &lt;/b&gt;&lt;b&gt;调用方法时抛出异常&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;方法：void ShowException(string str);&lt;/p&gt;  &lt;p&gt;测试：&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.ShowException(string.Empty))&lt;/p&gt;  &lt;p&gt;.Throws(new Exception(&amp;quot;参数不能为空！&amp;quot;));&lt;/p&gt;  &lt;p&gt;customer.Object.ShowException(&amp;quot;&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.3 &lt;/b&gt;&lt;b&gt;调用时赋值&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;方法：void AddCall();&lt;/p&gt;  &lt;p&gt;Mock测试：&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;int iCount = 0;&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.AddCall()).Callback(()=&amp;gt;iCount++);&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(0, iCount);&lt;/p&gt;  &lt;p&gt;customer.Object.AddCall();&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(1, iCount);&lt;/p&gt;  &lt;p&gt;customer.Object.AddCall();&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(2, iCount);&lt;/p&gt;  &lt;p&gt;customer.Object.AddCall();&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(3, iCount);&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.4 &lt;/b&gt;&lt;b&gt;Is&amp;lt;T&amp;gt;&lt;/b&gt;&lt;b&gt;：匹配确定的给定类型&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;customer.Setup(x =&amp;gt; x.SelfMatch(It.Is&amp;lt;int&amp;gt;(i =&amp;gt; i % 2 == 0))).Returns(&amp;quot;1&amp;quot;);&lt;/p&gt;  &lt;p&gt;方法SelfMatch接受int型参数，当参数为偶数时，才返回字符串1。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.5 &lt;/b&gt;&lt;b&gt;IsAny&amp;lt;T&amp;gt;&lt;/b&gt;&lt;b&gt;：匹配给定的任何值&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.SelfMatch(It.IsAny&amp;lt;int&amp;gt;())).Returns((int k) =&amp;gt; &amp;quot;任何数：&amp;quot; + k);&lt;/p&gt;  &lt;p&gt;方法SelfMatch接受int型，且任何int型参数都可以，然后返回：&amp;quot;任何数：&amp;quot; + k。&lt;/p&gt;  &lt;p&gt;这里说明一下Returns方法：&lt;/p&gt;  &lt;p&gt;Returns(Func&amp;lt;TResult&amp;gt;)&lt;/p&gt;  &lt;p&gt;Returns&amp;lt;T&amp;gt;(Func&amp;lt;T,TResult&amp;gt;)&lt;/p&gt;  &lt;p&gt;Returns&amp;lt;T1,T2&amp;gt;(Func&amp;lt;T1,T2,TResult&amp;gt;)&lt;/p&gt;  &lt;p&gt;Returns&amp;lt;T1,T2,T3&amp;gt;(Func&amp;lt;T1,T2,T3,TResult&amp;gt;)&lt;/p&gt;  &lt;p&gt;Returns&amp;lt;T1,T2,T3,T4&amp;gt;(Func&amp;lt;T1,T2,T3,T4,TResult&amp;gt;)&lt;/p&gt;  &lt;p&gt;Returns(TResult)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.6 &lt;/b&gt;&lt;b&gt;IsInRange&amp;lt;T&amp;gt;&lt;/b&gt;&lt;b&gt;：匹配给定类型的范围&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.SelfMatch(It.IsInRange&amp;lt;int&amp;gt;(0, 10, Range.Inclusive)))&lt;/p&gt;  &lt;p&gt;.Returns(&amp;quot;10以内的数&amp;quot;);&lt;/p&gt;  &lt;p&gt;方法SelfMatch接受int型，且当范围在[0,10]时，才返回10以内的数&lt;/p&gt;  &lt;p&gt;其中，这个方法，带有一个包含与排除开关。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.7 &lt;/b&gt;&lt;b&gt;IsRegex&amp;lt;T&amp;gt;&lt;/b&gt;&lt;b&gt;：正则匹配&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.ShowException(It.IsRegex(@&amp;quot;^\d+$&amp;quot;)))&lt;/p&gt;  &lt;p&gt;.Throws(new Exception(&amp;quot;不能是数字&amp;quot;));&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.8 &lt;/b&gt;&lt;b&gt;设置属性&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;public class Customer&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;public virtual int Unid { get; set; }&lt;/p&gt;  &lt;p&gt;public virtual string Name { get; set; }&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;测试&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;Customer&amp;gt;();&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.Name).Returns(&amp;quot;Tom&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.SetupProperty(p =&amp;gt; p.Name, &amp;quot;tt&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.9 &lt;/b&gt;&lt;b&gt;Callbacks&lt;/b&gt;&lt;b&gt;回调函数&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;当执行某方法时，调用其内部输入的（Action）委托&lt;/p&gt;  &lt;p&gt;看它的5种重载：&lt;/p&gt;  &lt;p&gt;Callback(Action)&lt;/p&gt;  &lt;p&gt;Callback&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt;)&lt;/p&gt;  &lt;p&gt;Callback&amp;lt;T1, T2&amp;gt;(Action&amp;lt;T1, T2&amp;gt;)&lt;/p&gt;  &lt;p&gt;Callback&amp;lt;T1, T2, T3&amp;gt;(Action&amp;lt;T1, T2, T3&amp;gt;)&lt;/p&gt;  &lt;p&gt;Callback&amp;lt;T1, T2, T3, T4&amp;gt;(Action&amp;lt;T1, T2, T3, T4&amp;gt;)&lt;/p&gt;  &lt;p&gt;这个方法调用其内部输入的Action委托，Aciton&amp;lt;T&amp;gt;有5种重载，所以这里的Callbacks有5种重载。&lt;/p&gt;  &lt;p&gt;以第二个为例：&lt;/p&gt;  &lt;p&gt;它的定义为：&lt;/p&gt;  &lt;p&gt;ICallbackResult Callback&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action)&lt;/p&gt;  &lt;p&gt;这个表示一个输入参数，&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall(It.IsAny&amp;lt;string&amp;gt;()))&lt;/p&gt;  &lt;p&gt;.Returns(&amp;quot;方法调用&amp;quot;)&lt;/p&gt;  &lt;p&gt;.Callback((string s)=&amp;gt;Console.WriteLine(&amp;quot;ok&amp;quot;+s));&lt;/p&gt;  &lt;p&gt;customer.Object.GetCall(&amp;quot;x&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.10 &lt;/b&gt;&lt;b&gt;Verify&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;验证&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;用于测试mock对象的方法或属性是否被调用执行。当不需要测试结果时用到&lt;/p&gt;  &lt;p&gt;重载很多：&lt;/p&gt;  &lt;p&gt;Verify()&lt;/p&gt;  &lt;p&gt;Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;)&lt;/p&gt;  &lt;p&gt;Verify&amp;lt;TResult&amp;gt;(Expression&amp;lt;Func&amp;lt;T, TResult&amp;gt;&amp;gt;)&lt;/p&gt;  &lt;p&gt;Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;, Times)&lt;/p&gt;  &lt;p&gt;Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;, String)&lt;/p&gt;  &lt;p&gt;Verify&amp;lt;TResult&amp;gt;(Expression&amp;lt;Func&amp;lt;T, TResult&amp;gt;&amp;gt;, Times)&lt;/p&gt;  &lt;p&gt;Verify&amp;lt;TResult&amp;gt;(Expression&amp;lt;Func&amp;lt;T, TResult&amp;gt;&amp;gt;, String)&lt;/p&gt;  &lt;p&gt;Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;, Times, String)&lt;/p&gt;  &lt;p&gt;Verify&amp;lt;TResult&amp;gt;(Expression&amp;lt;Func&amp;lt;T, TResult&amp;gt;&amp;gt;, Times, String)&lt;/p&gt;  &lt;p&gt;用其中三个举例&lt;/p&gt;  &lt;p&gt;第一个：Verify()，定义为：&lt;/p&gt;  &lt;p&gt;public void Verify()&lt;/p&gt;  &lt;p&gt;测试&lt;/p&gt;  &lt;p&gt;public void TestVerify()&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall(It.IsAny&amp;lt;string&amp;gt;()))&lt;/p&gt;  &lt;p&gt;.Returns(&amp;quot;方法调用&amp;quot;)&lt;/p&gt;  &lt;p&gt;.Callback((string s) =&amp;gt; Console.WriteLine(&amp;quot;ok&amp;quot; + s))&lt;/p&gt;  &lt;p&gt;.Verifiable();&lt;/p&gt;  &lt;p&gt;&lt;b&gt;customer.Object.GetCall(&amp;quot;&lt;/b&gt;&lt;b&gt;调用了！&amp;quot;);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;customer.Verify();&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;把Mock对象中的GetCall方法设置为可证实的（Verifiable()），&lt;/p&gt;  &lt;p&gt;如果不调用粗体部分语句，那么customer.Verify()执行就不能通过。这个方法很有用。&lt;/p&gt;  &lt;p&gt;第二个：Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;)，定义为：&lt;/p&gt;  &lt;p&gt;public void Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt; expression)&lt;/p&gt;  &lt;p&gt;customer.Verify(p =&amp;gt; p.GetCall(&amp;quot;call&amp;quot;));&lt;/p&gt;  &lt;p&gt;如果没有调用且输入call字串的参数，则失败。&lt;/p&gt;  &lt;p&gt;第三个：Verify(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;, Times, String)&lt;/p&gt;  &lt;p&gt;定义：&lt;/p&gt;  &lt;p&gt;public void Verify( Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt; expression,&lt;/p&gt;  &lt;p&gt;Times times,&lt;/p&gt;  &lt;p&gt;string failMessage&lt;/p&gt;  &lt;p&gt;)&lt;/p&gt;  &lt;p&gt;这个比上一个多了两个参数，一个用于表示调用次数相关描述，一个用于失败的时打印信息&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall(It.IsAny&amp;lt;string&amp;gt;()))&lt;/p&gt;  &lt;p&gt;.Returns(&amp;quot;方法调用&amp;quot;)&lt;/p&gt;  &lt;p&gt;.Callback((string s) =&amp;gt; Console.WriteLine(&amp;quot;ok&amp;quot; + s))&lt;/p&gt;  &lt;p&gt;.Verifiable();&lt;/p&gt;  &lt;p&gt;customer.Object.GetCall(&amp;quot;call&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.Object.GetCall(&amp;quot;call&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.Verify(p =&amp;gt; p.GetCall(&amp;quot;call&amp;quot;),&lt;/p&gt;  &lt;p&gt;Times.AtLeast(2),&amp;quot;至少应被调用2次&amp;quot;);&lt;/p&gt;  &lt;p&gt;当GetCall方法被调用最少2次（且参数为call）时，测试成功。&lt;/p&gt;  &lt;p&gt;方法中Times是个Times类类型，它有多个方法：&lt;/p&gt;  &lt;p&gt;AtLeast&lt;/p&gt;  &lt;p&gt;AtLeastOnce&lt;/p&gt;  &lt;p&gt;AtMost&lt;/p&gt;  &lt;p&gt;AtMostOnce&lt;/p&gt;  &lt;p&gt;Between&lt;/p&gt;  &lt;p&gt;Exactly&lt;/p&gt;  &lt;p&gt;Never&lt;/p&gt;  &lt;p&gt;Once&lt;/p&gt;  &lt;p&gt;可以从语义上理解它们各自是什么意思，例如：AtLeast的定义为：&lt;/p&gt;  &lt;p&gt;public static Times AtLeast(&lt;/p&gt;  &lt;p&gt;int callCount&lt;/p&gt;  &lt;p&gt;)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.11 &lt;/b&gt;&lt;b&gt;VerifyAll&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;验证&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在使用Verify方法时，只有被标记为可证实的（.Verifiable()）的才可以验证。&lt;/p&gt;  &lt;p&gt;但VerifyAll会验证所有的调用：&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall(It.IsAny&amp;lt;string&amp;gt;()))&lt;/p&gt;  &lt;p&gt;.Returns(&amp;quot;方法调用&amp;quot;)&lt;/p&gt;  &lt;p&gt;.Callback((string s) =&amp;gt; Console.WriteLine(&amp;quot;ok&amp;quot; + s));&lt;/p&gt;  &lt;p&gt;customer.Object.GetCall(&amp;quot;call&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.VerifyAll();&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;b&gt;4.12 &lt;/b&gt;Mock&amp;lt;T&amp;gt; Class&lt;b&gt;&lt;/b&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;public class Mock&amp;lt;T&amp;gt; : Mock &lt;/p&gt;  &lt;p&gt;where T : class&lt;/p&gt;  &lt;p&gt;这的构造方法：&lt;/p&gt;  &lt;p&gt;Mock&amp;lt;T&amp;gt;()&lt;/p&gt;  &lt;p&gt;Mock&amp;lt;T&amp;gt;(MockBehavior)&lt;/p&gt;  &lt;p&gt;Mock&amp;lt;T&amp;gt;(array&amp;lt;Object&amp;gt;[])&lt;/p&gt;  &lt;p&gt;Mock&amp;lt;T&amp;gt;(MockBehavior, array&amp;lt;Object&amp;gt;[])&lt;/p&gt;  &lt;p&gt;Mock的泛型实现类，它有很多方法和属性。这里一一列举。&lt;/p&gt;  &lt;p&gt;（一）方法&lt;/p&gt;  &lt;p&gt;（1）As&amp;lt;TInterface&amp;gt;方法&lt;/p&gt;  &lt;p&gt;为mock添加接口实现（mock），可以给它指定设置。&lt;/p&gt;  &lt;p&gt;在mock对象的属性（或方法）首次使用之前才有效。且，参数只能是接口。&lt;/p&gt;  &lt;p&gt;定义：&lt;/p&gt;  &lt;p&gt;public virtual Mock&amp;lt;TInterface&amp;gt; As&amp;lt;TInterface&amp;gt;()&lt;/p&gt;  &lt;p&gt;where TInterface : class&lt;/p&gt;  &lt;p&gt;示例：&lt;/p&gt;  &lt;p&gt;两个接口：&lt;/p&gt;  &lt;p&gt;其中的Icustomer接口还是前几篇中用到的，这里添加一个Iorder接口：&lt;/p&gt;  &lt;p&gt;public interface IOrder&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;string ShowTitle(string str);&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;Mock测试：&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall()).Returns(&amp;quot;方法调用&amp;quot;);&lt;/p&gt;  &lt;p&gt;customer.Object.GetCall();&lt;/p&gt;  &lt;p&gt;var order=customer.As&amp;lt;IOrder&amp;gt;();&lt;/p&gt;  &lt;p&gt;order.Setup(p =&amp;gt; p.ShowTitle(It.IsAny&amp;lt;string&amp;gt;())).Returns(&amp;quot;ok&amp;quot;);&lt;/p&gt;  &lt;p&gt;Assert.AreEqual(&amp;quot;ok&amp;quot;,order.Object.ShowTitle(&amp;quot;&amp;quot;));&lt;/p&gt;  &lt;p&gt;这个将出现异常，因为在As之前，已经对GetCall进行了调用。&lt;/p&gt;  &lt;p&gt;（2）SetUp方法&lt;/p&gt;  &lt;p&gt;为模拟的对象中的方法指定设置，它有两个重载：&lt;/p&gt;  &lt;p&gt;Setup(Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt;)&lt;/p&gt;  &lt;p&gt;Setup&amp;lt;TResult&amp;gt;(Expression&amp;lt;Func&amp;lt;T,TResult&amp;gt;&amp;gt;)&lt;/p&gt;  &lt;p&gt;从两个委托可以知道，这两个一个是为没有返回值的方法设置，一个是对有返回值的方法设置&lt;/p&gt;  &lt;p&gt;public void TestSetUp()&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;var customer = new Mock&amp;lt;ICustomer&amp;gt;();&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.AddCall())&lt;/p&gt;  &lt;p&gt;.Callback(()=&amp;gt;Console.WriteLine(&amp;quot;没有返回值&amp;quot;));&lt;/p&gt;  &lt;p&gt;customer.Setup(p =&amp;gt; p.GetCall(It.IsAny&amp;lt;string&amp;gt;()))&lt;/p&gt;  &lt;p&gt;.Returns(&amp;quot;ok&amp;quot;)&lt;/p&gt;  &lt;p&gt;.Callback((string q) =&amp;gt; Console.WriteLine(&amp;quot;有返回值&amp;quot;));&lt;/p&gt;  &lt;p&gt;customer.Object.AddCall();&lt;/p&gt;  &lt;p&gt;customer.Object.GetCall(&amp;quot;&amp;quot;);&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2503477.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/16/2503477.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/15/2501307.html</id><title type="text">NInject注入方式</title><summary type="text">Ninject官方网址为：http://www.ninject.org/ 。 类的定义privateIWeapon_weapon;//构造函数注入[Inject]publicSamurai(IWeaponweapon){_weapon=weapon;}//属性函数注入[Inject]publicIWeaponWeapon{get{return_weapon;}set{_weapon=value;}}//方法函数注入[Inject]publicvoidArm(IWeaponweapon){_weapon=weapon;}//字段函数注入[Inject]privateIWeapon_weapo..</summary><published>2012-05-15T04:14:00Z</published><updated>2012-05-15T04:14:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/15/2501307.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/15/2501307.html"/><content type="html"> &lt;ol&gt;&lt;br /&gt;&lt;li&gt;　Ninject官方网址为：&lt;a href="http://www.ninject.org/" target="_blank" data-ke-src="http://www.ninject.org/"&gt;http://www.ninject.org/&lt;/a&gt; 。&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;&amp;nbsp; &amp;nbsp;类的定义&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;private&amp;nbsp;IWeapon&amp;nbsp;_weapon;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//构造函数注入&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Inject]&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;Samurai(IWeapon&amp;nbsp;weapon)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_weapon&amp;nbsp;=&amp;nbsp;weapon;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//属性函数注入&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Inject]&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;IWeapon&amp;nbsp;Weapon&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;_weapon;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_weapon&amp;nbsp;=&amp;nbsp;value;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//方法函数注入&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Inject]&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Arm(IWeapon&amp;nbsp;weapon)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_weapon&amp;nbsp;=&amp;nbsp;weapon;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//字段函数注入&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Inject]&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;IWeapon&amp;nbsp;_weapon;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Attack(string&amp;nbsp;target)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_weapon.Hit(target);&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;添加绑定关系(可创建多个Module）&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; WarriorModule : NinjectModule&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;override&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; &lt;br /&gt;Load()&lt;br /&gt;{&lt;br /&gt;Bind&amp;lt;IWeapon&amp;gt;().To&amp;lt;Sword&amp;gt;();&lt;br /&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;Bind&amp;lt;Samurai&amp;gt;().ToSelf();&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;构造函数依注入(只能在一个构造函数上使用Inject&lt;/span&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;IKernel kernal = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StandardKernel(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; WarriorModule());&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;Samurai s = new &lt;br /&gt;Samurai(kernal.Get&amp;lt;IWeapon&amp;gt;()); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; 构造函数注入&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;Samurai s = &lt;br /&gt;kernal.Get&amp;lt;Samurai&amp;gt;();&lt;br /&gt;s.Attack(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;enemy&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;属性注入&lt;/span&gt;&lt;br /&gt;IKernel kernal = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StandardKernel(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;br /&gt;WarriorModule());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Samurai s = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Samurai() { Weapon = &lt;br /&gt;kernal.Get&amp;lt;IWeapon&amp;gt;() };&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; 属性注入&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;s.Attack(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;enemy&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;方法注入&lt;/span&gt;&lt;br /&gt;IKernel kernal = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StandardKernel(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; WarriorModule());&lt;br /&gt;Samurai s = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; &lt;br /&gt;Samurai();&lt;br /&gt;s.Arm(kernal.Get&amp;lt;IWeapon&amp;gt;()); &lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; 方法注入&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;s.Attack(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;enemy&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(229, 51, 51);"&gt;字段注入&lt;/span&gt;&lt;/li&gt;&amp;nbsp;IKernel kernal = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StandardKernel(&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; WarriorModule());&lt;br /&gt;Samurai s = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Samurai();&lt;br /&gt;s._weapon = &lt;br /&gt;kernal.Get&amp;lt;IWeapon&amp;gt;(); &lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; 需将Samurai类中字段_weapon修饰符改为public才可以访问&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;s.Attack(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;enemy&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2501307.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/15/2501307.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/08/2490530.html</id><title type="text">notepad++ 使用技巧</title><summary type="text">以下以6.1.2中文版(免安装版)为例说明： 软件下载地址：http://notepad-plus-plus.org/download/v6.1.2.html 设置软件语言： 设置—&gt;首选项—&gt;常用 设置双击关闭标签：设置—&gt;首选项—&gt;常用—&gt;标签栏 显示行号：设置—&gt;首选项—&gt;编辑 ASCII码字符列表：编辑—&gt;Charact...</summary><published>2012-05-08T10:20:00Z</published><updated>2012-05-08T10:20:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/08/2490530.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/08/2490530.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;以下以6.1.2中文版(免安装版)为例说明：&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;软件下载地址：&lt;a title="http://notepad-plus-plus.org/download/v6.1.2.html" href="http://notepad-plus-plus.org/download/v6.1.2.html"&gt;http://notepad-plus-plus.org/download/v6.1.2.html&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;设置软件语言： 设置—&amp;gt;首选项—&amp;gt;常用 &lt;/li&gt;      &lt;li&gt;设置双击关闭标签：设置—&amp;gt;首选项—&amp;gt;常用—&amp;gt;标签栏 &lt;/li&gt;      &lt;li&gt;显示行号：设置—&amp;gt;首选项—&amp;gt;编辑 &lt;/li&gt;      &lt;li&gt;ASCII码字符列表：编辑—&amp;gt;Character Panel &lt;/li&gt;      &lt;li&gt;剪切板历史：编辑—&amp;gt;Clipboard History &lt;/li&gt;      &lt;li&gt;书签：搜索—&amp;gt;书签&amp;#160; (F2：上一书签&amp;#160;&amp;#160; Shift+F2：下一个书签） &lt;/li&gt;      &lt;li&gt;自动换行：视图—&amp;gt;自动换行 &lt;/li&gt;      &lt;li&gt;左侧显示已打开的文件列表：设置—&amp;gt;首选项—&amp;gt;常用—&amp;gt;Document Swticher&lt;/li&gt;   &lt;/ol&gt;&lt;/blockquote&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2490530.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/08/2490530.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/08/2490502.html</id><title type="text">Cache缓存示例(WCF)</title><summary type="text">1、新增缓存 var cache = HttpRuntime.Cache; cache.Insert(缓存名称, 缓存数据, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 绝对过期时间（分钟）, 0), CacheItemPriority.Default, CachedItemRemoveCallB...</summary><published>2012-05-08T10:02:00Z</published><updated>2012-05-08T10:02:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/08/2490502.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/08/2490502.html"/><content type="html">&lt;p&gt;1、新增缓存&lt;/p&gt; &lt;p&gt;var cache = HttpRuntime.Cache;&lt;br/&gt;      cache.Insert(缓存名称, 缓存数据, null, Cache.NoAbsoluteExpiration,&lt;br/&gt;                   new TimeSpan(0, 绝对过期时间（分钟）, 0), CacheItemPriority.Default, CachedItemRemoveCallBack[回调函数]);&amp;nbsp;2、缓存回调函数(缓存到期后需要重新添加缓存）/// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 缓存到期后的回调函数&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="key"&amp;gt;缓存名称&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="value"&amp;gt;缓存的值&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="reason"&amp;gt;缓存到期的原因&amp;lt;/param&amp;gt;&lt;br/&gt;        private void CachedItemRemoveCallBack(string key, object value,&lt;br/&gt;                 CacheItemRemovedReason reason)&lt;br/&gt;        {}&lt;/p&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2490502.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/08/2490502.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/05/06/2486142.html</id><title type="text">ActionResult类继承结构</title><summary type="text"/><published>2012-05-06T09:26:00Z</published><updated>2012-05-06T09:26:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/05/06/2486142.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/05/06/2486142.html"/><content type="html">&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:0941e27e-1ce9-4bee-b56e-75657224116e" class="wlWriterEditableSmartContent"&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:0941e27e-1ce9-4bee-b56e-75657224116e" class="wlWriterSmartContent"&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2486142.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/05/06/2486142.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/gossip/archive/2012/04/25/2470110.html</id><title type="text">Using Test-Driven Development and the Red-Green-Refactor Workflow</title><summary type="text">With test-driven development (TDD), you use unit tests to help design your code. This can be an odd concept if you are used to testing after you have finished coding, but there is a lot of sense in...</summary><published>2012-04-25T08:59:00Z</published><updated>2012-04-25T08:59:00Z</updated><author><name>扯</name><uri>http://www.cnblogs.com/gossip/</uri></author><link rel="alternate" href="http://www.cnblogs.com/gossip/archive/2012/04/25/2470110.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/gossip/archive/2012/04/25/2470110.html"/><content type="html">&lt;p&gt;With test-driven development (TDD), you use unit tests to help design your code. This can be an odd    &lt;br /&gt;concept if you are used to testing after you have finished coding, but there is a lot of sense in this     &lt;br /&gt;approach. The key concept is a development workflo w called red-green-refactor. It works like this:     &lt;br /&gt;1.&amp;#160;&amp;#160; Determine that you need to add a new feature or method to your application.     &lt;br /&gt;2.&amp;#160;&amp;#160; Write the test that will validate the behavior of the new feature when it is     &lt;br /&gt;written.     &lt;br /&gt;3.&amp;#160;&amp;#160; Run the test and get a red light.     &lt;br /&gt;4.&amp;#160;&amp;#160; Write the code that implements the new feature.     &lt;br /&gt;5.&amp;#160;&amp;#160; Run the test again and correct the code until you get a green light.     &lt;br /&gt;6.&amp;#160;&amp;#160; Refactor the code if required. For example, reorganize the statements, rename     &lt;br /&gt;the variables, and so on.&amp;#160; &lt;br /&gt;7.&amp;#160;&amp;#160; Run the test to confirm that your changes have not changed the behavior of     &lt;br /&gt;your additions.&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;This workflow is repeated fo r every feature you add.&amp;#160; &lt;br /&gt;Let’s walk through an example so you can see how it works. Let’s imagine the behavior we want is     &lt;br /&gt;the ability to add a bid to an item, but only if the bid&amp;#160; is higher than all previous bids for that item. First,     &lt;br /&gt;we will add a stub method to the&amp;#160; Item class, as shown in Listing 4-8.     &lt;br /&gt;Listing 4-8. Adding a Stub Method to the Item Class     &lt;br /&gt;using System;     &lt;br /&gt;using System.Collections.Generic;     &lt;br /&gt;&amp;#160; &lt;br /&gt;namespace TheMVCPattern.Models {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Item {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int ItemID { get; private set; } // The unique key     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Title { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Description { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public DateTime AuctionEndDate { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IList&amp;lt;Bid&amp;gt; Bids { get; private set; }     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void AddBid(Member memberParam, decimal amountParam) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotImplementedException();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It’s obvious that the AddBid method, shown in bold, doesn’t display the required behavior, but we    &lt;br /&gt;n’t let that stop us. The key to TDD is to test for the correct behavior before&amp;#160; implementing the feature.     &lt;br /&gt;are going to test for three different aspects of the behavior we are seeking to implement:&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;•&amp;#160; When there are no bids, any bid value can be added.&amp;#160; &lt;br /&gt;•&amp;#160; When there are existing bids, a higher value bid can be added.&amp;#160; &lt;br /&gt;•&amp;#160; When there are existing bids, a lower value bid cannot be added.     &lt;br /&gt;&amp;#160; &lt;br /&gt;To do this, we create three test methods, which are shown in Listing 4-9.     &lt;br /&gt;Listing 4-9. Three Test Fixtures     &lt;br /&gt;[TestMethod()]     &lt;br /&gt;public void CanAddBid() {     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Arrange - set up the scenario     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item target = new Item();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Member memberParam = new Member();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Decimal amountParam = 150M;     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Act - perform the test     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; target.AddBid(memberParam, amountParam);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Assert - check the behavior     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(1, target.Bids.Count());     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(amountParam, target.Bids[0].BidAmount);     &lt;br /&gt;}     &lt;br /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;[TestMethod()]    &lt;br /&gt;[ExpectedException(typeof(InvalidOperationException))]     &lt;br /&gt;public void CannotAddLowerBid() {     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Arrange     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item target = new Item();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Member memberParam = new Member();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Decimal amountParam = 150M;     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Act     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; target.AddBid(memberParam, amountParam);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; target.AddBid(memberParam, amountParam - 10);     &lt;br /&gt;}     &lt;br /&gt;&amp;#160; &lt;br /&gt;[TestMethod()]     &lt;br /&gt;public void CanAddHigherBid() {     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Arrange     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Item target = new Item();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Member firstMember = new Member();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Member secondMember = new Member();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Decimal amountParam = 150M;     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Act     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; target.AddBid(firstMember, amountParam);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; target.AddBid(secondMember, amountParam + 10); &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160; // Assert    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(2, target.Bids.Count());     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(amountParam + 10, target.Bids[1].BidAmount);     &lt;br /&gt;}     &lt;br /&gt;&amp;#160; &lt;br /&gt;We’ve created a unit test for each of the behaviors we want to see. The test methods follow the     &lt;br /&gt;arrange/act/assert pattern to create, test, and va lidate one aspect of the overall behavior. The     &lt;br /&gt;CannotAddLowerBid method doesn’t have an assert part in the method body because a successful test is an     &lt;br /&gt;exception being thrown, which we assert by applying the&amp;#160; ExpectedException attribute on the test method. &lt;/p&gt;  &lt;p&gt;As we would expect, all of these tests fail when we run them, as shown in Figure 4-10. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gossip/201204/201204251658524797.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/gossip/201204/201204251658542519.png" width="704" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Figure 4-10.&amp;#160; Running the unit tests for the first time    &lt;br /&gt;We can now implement our first pass at the AddBid method, as shown in Listing 4-10.     &lt;br /&gt;Listing 4-10.&amp;#160; Implementing the AddBid Method     &lt;br /&gt;using System;     &lt;br /&gt;using System.Collections.Generic;     &lt;br /&gt;&amp;#160; &lt;br /&gt;namespace TheMVCPattern.Models {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Item { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int ItemID { get; private set; } // The unique key    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Title { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Description { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public DateTime AuctionEndDate { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IList&amp;lt;Bid&amp;gt; Bids { get; set; }     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Item() {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Bids = new List&amp;lt;Bid&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void AddBid(Member memberParam, decimal amountParam) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Bids.Add(new Bid() {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BidAmount = amountParam,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DatePlaced = DateTime.Now,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Member = memberParam     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}     &lt;br /&gt;&amp;#160; &lt;br /&gt;We’ve added an initial implementation of the AddBid method to the&amp;#160; Item&amp;#160; class. We’ve also added a     &lt;br /&gt;simple constructor so we can create instances of Item and ensure that the collection of Bid objects is     &lt;br /&gt;properly initialized. Running the unit tests again generates better results, as shown in Figure 4-11. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gossip/201204/201204251658576405.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/gossip/201204/201204251658593015.png" width="644" height="249" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Two of the three unit tests have passed. The one that has failed is CannotAddLowerBid. We didn’t add    &lt;br /&gt;any checks to make sure that a bid is higher than previous bids on the item. We need to modify our     &lt;br /&gt;mplementation to put this logic in place, as shown in Listing 4-11. &lt;/p&gt;  &lt;p&gt;Listing 4-11.&amp;#160; Improving the Implementation of the AddBid Method    &lt;br /&gt;using System;     &lt;br /&gt;using System.Collections.Generic;     &lt;br /&gt;using System.Linq;     &lt;br /&gt;&amp;#160; &lt;br /&gt;namespace TheMVCPattern.Models {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Item {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int ItemID { get; private set; } // The unique key     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Title { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Description { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public DateTime AuctionEndDate { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IList&amp;lt;Bid&amp;gt; Bids { get; set; }     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Item() {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Bids = new List&amp;lt;Bid&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void AddBid(Member memberParam, decimal amountParam) {     &lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Bids.Count() == 0 || amountParam &amp;gt; Bids.Max(e =&amp;gt; e.BidAmount)) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Bids.Add(new Bid() {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BidAmount = amountParam,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DatePlaced = DateTime.Now,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Member = memberParam     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(&amp;quot;Bid amount too low&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}     &lt;br /&gt;&amp;#160; &lt;br /&gt;You can see that we have expressed the error condition in such a way as to satisfy the unit test we     &lt;br /&gt;wrote before we started coding; that is, we throw an InvalidOperationException when a bid is received     &lt;br /&gt;that is too low.&amp;#160; &lt;/p&gt;  &lt;p&gt;Each time we change the implementation of the&amp;#160; AddBid method, we run our unit tests again. The    &lt;br /&gt;results are shown in Figure 4-12. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/gossip/201204/201204251659013213.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/gossip/201204/201204251659037904.png" width="782" height="305" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Success! We have implemented our new feature such that&amp;#160; it passes all of the unit tests. The last step    &lt;br /&gt;is to take a moment and be sure that our tests really do test all aspects of the behavior or feature we are     &lt;br /&gt;implementing. If so, we are finished. If not, then we add more tests and repeat the cycle, and we keep     &lt;br /&gt;going until we are confident that we have a comprehensive set of tests and an implementation that     &lt;br /&gt;passes them all.     &lt;br /&gt;This cycle is the essence of TDD. There is a lot&amp;#160; to recommend it as a development style, not least     &lt;br /&gt;because it makes a programmer think about how a change or enhancement should behave before&amp;#160; the     &lt;br /&gt;coding starts. You always have a clear end point in view and a way to check that you are there. And if you     &lt;br /&gt;have unit tests that cover the rest of your application, you can be sure that your additions have not     &lt;br /&gt;changed the behavior elsewhere. &lt;/p&gt;&lt;img src="http://www.cnblogs.com/gossip/aggbug/2470110.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/gossip/archive/2012/04/25/2470110.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
