DynamicsCRM编程之单元测试技术:MicrosoftFakeFrame
“今天不营业”通过精心收集,向本站投稿了8篇DynamicsCRM编程之单元测试技术:MicrosoftFakeFrame,下面是小编帮大家整理后的DynamicsCRM编程之单元测试技术:MicrosoftFakeFrame,希望对大家的学习与工作有所帮助。
篇1:DynamicsCRM编程之单元测试技术:MicrosoftFakeFrame
对于基于复杂的框架进行编程,最难的地方并不是编写代码,而是怎么快速有效的去调试出错的代码,怎么高效精准的完成代码的单元测试,就拿Dynamics CRM Plugin的编写来看,编写一个上千行代码的插件不是一件很难的事情,但是,如果把这上千行代码调试完成并让它行之有效的按我们的目的精准的进行呢?这也是初级技术员和高级技术员的核心差距。
今天给大家带来一篇关于Plugin的单元测试文章,博主2年前撰写过另外一篇类似的单元测试文档,使用的是Rhino Mock技术。但是今天我们要使用的技术,则是Microsoft Fake Framework技术。
什么是Fake Framework?是微软推出的一款功能强大的Unit Test Framework,它和Rhino Mock这些基于OOP概念的Tools有着根本的区别与优势。它能测试私有方法和重写系统框架的封闭代码,当然,其功能远不止于这些,大家有兴趣可以对其进行深入了解。
要对Dynamics CRM Plugin进行单元调试,需要解决的问题,当然是如何去模拟并构造IServiceProvider以及其包含的参数。对于这些知识,大家不必太过担心,可以参考下面给出的Demo
public IOrganizationService crmService; public IOrganizationServiceFactory crmServiceFactory; public IPluginExecutionContext context; public ITracingService tracing; public IServiceProvider serviceProvider; public Guid UserId = Guid.Empty; private const string CRM_SVC_PATH = “your server/XRMServices//Organization.svc”; private const string CRM_USERNAME = “account”; private const string CRM_PASSWORD = “pwd”; [TestInitialize] public void Startup {crmService = CRMHelperV6.GetOrganizationServiceProxy(new Uri(CRM_SVC_PATH), AuthenticationProviderType.Federation, new string[] { CRM_USERNAME, CRM_PASSWORD }); //构造真是的CRM ProxycrmServiceFactory = new Microsoft.Xrm.Sdk.Fakes.StubIOrganizationServiceFactory(){ CreateOrganizationServiceNullableOfGuid = (id) =>{ return crmService; }};serviceProvider = new System.Fakes.StubIServiceProvider() { GetServiceType = (a)=>{object result=new object();if (a == typeof(IOrganizationServiceFactory)){ result = crmServiceFactory; }else if (a == typeof(IPluginExecutionContext)){ result = context;}if (a == typeof(ITracingService)){ }return result; } }; } [TestMethod] public void CreateInvoiceDetailToXero() {Entity invoiceDetail = new Entity(“invoicedetail”);invoiceDetail.Attributes.Add(“invoiceid”, new EntityReference(“invoice”, Guid.Parse(“{C1CCE633-D555-E511-8104-C4346BADD6F4}”)));invoiceDetail.Attributes.Add(“quantity”, 2.0m);invoiceDetail.Attributes.Add(“productid”, new EntityReference(“product”, Guid.Parse(“{6739BCB6-6EB4-E411-80DF-C4346BADE648}”)));invoiceDetail.Attributes.Add(“baseamount”, new Money(1000));invoiceDetail.Attributes.Add(“invoicedetailid”, Guid.Parse(“{D4E44A0F-E255-E511-8104-C4346BADD6F4}”));invoiceDetail.Attributes.Add(“q2_synctoxero”, true);ParameterCollection inputParameter = new ParameterCollection();inputParameter.Add(“Target”, invoiceDetail);context = new Microsoft.Xrm.Sdk.Fakes.StubIPluginExecutionContext(){ InputParametersGet = () =>{ return inputParameter; }};CrmIntegrationPlugins.InvoiceDetailPlugin invD = new InvoiceDetailPlugin();invD.Execute(serviceProvider); }在这里呢,我们首先构造了一个真实的CRM Proxy,并模拟了IServiceProvider以及其参数,大家当然还可以根据具体需要,模拟Target,PreImage和PostImage,模拟输入参数并根据具体业务进行具体的Mock处理,
篇2:linuxshell编程之正则表达式
正则表达式和通配符区别:
通配符也就三个*、?、[]
正则表达式是在文件中进行查找,
linuxshell编程之正则表达式
,
篇3:ADO.NET编程之基础知识
ADO.NET是专门为帮助开发人员建立在Intranet或Internet上使用的高效多层数据库应用程序而设计的,它作为Windows平台下开发应用系统的数据访问技术,已经在企业信息系统的开发中得到了广泛的应用,
一.ADO.NET基础
程序和数据库交互,要通过ADO.NET进行;通过ADO.NET就能在数据库中执行SQL了。ADO.NET中提供了对不同数据库的统一操作接口(ODBC)。另外还有一种操作数据库的接口是JDBC。
ADO.NET中通过SqlConnection类创建到SQL Server的链接,Sqlconnection代表一个数据库的链接,ADO.NET中的链接等资源都实现了IDisposable接口。
实现了IDisposable接口的对象,在使用完了,要进行资源的释放。调用Dispose方法。
连接方式访问数据库,连接要打开,使用完要关闭。关闭之后,还可以再打开,这就是Close和Dispose的区别。Dispose,是完全释放资源。
现在来测试一下,连接数据库是否成功了。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//使用ADO.NET技术,必须要导入这两个命名空间using System.Data;using System.Data.SqlClient;//namespace ADO.NET1{ class Program { static void Main(string[] args) {//创建数据库连接(连接字符串)string sqlCon = “server=.;database=DB_MyStudentLife;uid=sa;pwd=Password_1”;SqlConnection scon = new SqlConnection(sqlCon);//打开数据库连接 scon.Open();//测试,判断数据库的连接状态if (scon.State == ConnectionState.Closed){ Console.WriteLine(“连接数据库失败”);}if (scon.State == ConnectionState.Open){ Console.WriteLine(“成功打开连接数据库,连接成功”);}Console.ReadKey(); } }}
测试效果图:
最后我们来看看SqlConnection对象的内部原理吧:使用反编译工具reflector就可以;
1.从图中,我们看出来,SqlConnection继承了DbConnection类,实现了ICloneable接口
2.ICloneable接口里面是啥样子呢,我们来看一下,反编译:
3.接下来,我们看下Dbconnection类:
从图中可以看出,Dbconnection类是一个抽象类,继承了Component类,实现了IDbConnection接口,和IDisposable接口,下面我们分别来看看这几个
4.Component类:
看得出来这个类,也实现了IDisposable接口哦,
好了,其他还是来看看IDisposable接口内部的神秘面纱吧:
看得出来,IDisosable定义了一个Dispose(),抽象无返回值的方法,
以上所述就是本文的全部内容了,希望大家能够喜欢。
篇4:shell编程之cut
cut以文件中行为单位,根据你设定的条件,把部分内容剪切打印出来,输出到标准输出,并不会保存到任何文件中
-b 范围 根据字节确定范围-c 范围 根据字符确定范围-f 范围根据设定field确定范围。默认是TAB分割field。使用-d指定。
范围设定的格式n 剪切n位的内容。-n 剪切1-n位的内容。n- 剪切n-最后一位的内容,
n-m 剪切n-m位的内容
-d ‘:’ 指定分隔符。-s 只打印有分隔符存在的行。--out=delimiter=string 制定分隔符的输出,可以用来格式化输出。
-b与-c的区别就是字符跟字节的区别。字节是存储在计算机里面的最小单位。而字符是指编码里面有一个意义的独立单元。比如汉字编码中的一个汉字或者一个标点,又或者acsii码里面的一个字母或者标点。所以一个字符肯呢过包含一个或多个字节。就这么个关系。
例子:cut -d ‘:‘ -f 2-3 -s /etc/passwd
篇5:Shell编程之正则表达式详解
正则表达式详解
普通字符:只是字面的意思
元字符:超过字面意思的意义
基本正则表达式元字符及其意义
* #0个或多个在*字符之前的那个普通字符
. #匹配任意字符
^ #匹配行首$ #匹配行尾
$$ #执行上一条命令
!$ #上一条命令的最后一个参数,例如是/etc/passwd,继续对该参数操作,可以为 cat !$
[] #匹配字符集合
\ #转义符
\{n\} #匹配前面字符出现n次
\{n,\} #匹配前面字符至少出现n次
\{n,m\} #匹配前面字符出现n-m次示例
* hel*o #可以匹配helll8o、hello、hellllo
. ...73.#可以匹配abc73.、!@#73?、12373c
^ ^...X86* #可以匹配以abcX86fang开头的字符
$ make$ #表示以make结尾
^$ #表示空行
^.$ #表示某行只有一个字符
[a-z] #表示a-z所有小写字母
[0-9] #表示0-9所有数字
[b-q] #表示b-q字母
[^b-q]#取反,除了b-q的所有字符
[A-Za-z] [A-Za-z]*#能匹配任何一个英文单词
\* #将\后面的元字符转换为字面意思
\
\{n\} #JO\{3\}B 匹配值为JOOOB
\{n,\} #JO\{3,\}B 匹配值为JOOOB JOOOOB JOOOOOOOB
\{n,m\}#JO\{3,6\}B 匹配值为JOOOB JOOOOOB JOOOOOOB
[a-z] \{5\} #hello house whowh 精确匹配5个小写字母
echo [abc]* #开头为a/b/c的任意多字符的文件
echo [^abc]* #开头不是a/b/c的任意多字符的文件
touch {a,b,c}-{1,2,3} #通过穷举来创建文件,每个文件匹配来创建,总共9个文件
!$#上一条命令中的最后一个参数
;#表示命令结束
===========================================================================
扩展正则表达式元字符及其意义
? #匹配0个或1个在其之前的那个普通字符
+ #匹配1个或多个在其之前的那个普通字符
#表示一个字符集合或用在expr中
|#表示或,匹配一组可选的字符
? JO?B #匹配JO1B JO@B JO!B ,只匹配一个字符,
Shell编程之正则表达式详解
,
如果是JOB或JOOOB则不匹配
+ S+EU #至少匹配前面的字符1次,可以匹配多次
* S*U #可匹配S123U SSUU S!@#U SU
()符号和|符号 re(a|e|o)d #匹配read reed reod
示例
1、列出所有以.awk结尾的文件
ll *.awk
2、列出以0开头,后面跟一个字符且以.pem为后缀的文件
ll 0?.pem
3、列出在a-h范围内以字母开头并以.awk结尾的文件
ll [a-h]*.awk
4、列出以a-h范围内字母开头且句点后不是以.awk结尾的文件
ll [a-h]*.[^awk]*
5、列出满足在a-h范围内以字母开头并以.awk结尾的文件,或列出以0开头,后面跟一个字符且以.pem为后缀的文件
ll {[a-h]*.awk,0?.pem}
篇6:我眼中的编程之美
很多人都说编程的人怀揣着一个改变世界的梦想,无数的年轻人投身其中,用梦想和思考改变世界,微软亚洲研究院的八名程序员和实习生集体创作出了一本“编程之美”,用文字和符号与同道人沟通共同的编程梦想,并把它献给微软亚洲研究院成立十周年。下面,让我们来听听其中一名实习生作者所理解的编程之美。
作者:陈远 西北工业大学硕士生
我应该算是最早知道将要编写《编程之美-微软面试指南》这本书的少数几个人之一,那时邹欣老师正在对《移山之道》进行最后的润色,而我还在学校里上研究生课程,生平第一次接受正统的计算机专业教育。当邹老师问我要不要参与编写时,做为一名自诩的“文学青年”而不是“计算机高手”,我毫不犹豫地答应了。
我本科读的是航空学院,在大二时闲得无聊抱着玩的心态才开始真正