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从未实例化过.因此,对Xrmwithin的任何引用都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 次 |
| 最近记录: |