Dav*_*ark 7 testing dependency-injection crm dynamics-crm typescript
如何在TypeScript中为可测试的Dynamics CRM表单编写类?
通过testable,我的意思是一个非静态类,可以实例化并传递一个模拟Xrm对象.
我目前的方法是这样的,但它有局限性(我解释):
export class Contact {
Xrm: Xrm.XrmStatic;
constructor(xrm?: Xrm.XrmStatic) {
this.Xrm = xrm;
}
onLoad(): void {
if (this.Xrm) { Xrm = this.Xrm; }
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
首先,Contact
导出类以便可以通过CRM表单引用.CRM在调用它的函数之前无法实例化对象,因此要调用这些方法,我在CRM表单设计器中使用Contact.prototype.onLoad.
我的测试看起来像这样:
beforeEach(function () {
this.XrmMock = new XrmStaticMock();
this.contact = new Contact(this.XrmMock);
this.contact.onLoad();
}
it('does stuff', function () {
// ...
}
Run Code Online (Sandbox Code Playgroud)
测试能够实例化Contact
并传递XrmMock
给构造函数.随后onLoad()
调用时,它的计算结果if (this.Xrm)
为true,并使用XrmMock
.相反,当Contact.prototype.onLoad()
从CRM内部调用时,它(this.Xrm)
是假的,因为Contact
从未实例化过.因此,对Xrm
within的任何引用都onLoad()
使用默认Xrm
命名空间(这是我们想要的).我们想要这个,因为当打开CRM表单时,Xrm
浏览器会加载真正的依赖项.
这里的限制是必须在每个想要使用Xrm
依赖项的方法中编写条件检查.怎么能克服这个?
这是一个关于Xrm.Page对象模型的文档的链接.我的类和Xrm mock是使用@ types/xrm编写的.
我很感激我在这里提出了多个问题,如果你认为你可以指导我写一个更具体的问题,请告诉我:)
小智 1
为什么您要Contact.prototype.onLoad
在 CRM 中调用该方法,而不是像在测试中那样调用实例化 Contact 类的方法,但使用 CRM 的Xrm
对象?例如
function ContactOnLoad() {
var contact = new Contact(Xrm);
contact.onLoad();
}
Run Code Online (Sandbox Code Playgroud)
然后在表单的 OnLoad 处理程序中调用ContactOnLoad
. 如果您只是调用Contact.prototype.onLoad
,this
可能会引用您的 window 对象而不是 的新实例Contact
。
归档时间: |
|
查看次数: |
324 次 |
最近记录: |