如何使用 TypeScript 为 Dynamics CRM 表单编写可测试的类?
所谓可测试,是指可以实例化并传递模拟 Xrm 对象的非静态类。
我目前的方法是这样的,但它有局限性(我会解释):
export class Contact {
Xrm: Xrm.XrmStatic;
constructor(xrm?: Xrm.XrmStatic) {
this.Xrm = xrm;
}
onLoad(): void {
if (this.Xrm) { Xrm = this.Xrm; }
// ...
}
}
首先,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 () {
// ...
}
测试能够实例化 Contact
并将 XrmMock
传递给构造函数。随后当 onLoad()
被调用时,它评估 if (this.Xrm)
为真,并使用 XrmMock
。相反,当从 CRM 中调用 Contact.prototype.onLoad()
时,(this.Xrm)
为 false,因为 Contact
从未被实例化.因此,在 onLoad()
中对 Xrm
的任何引用都使用默认的 Xrm
命名空间(这是我们想要的)。我们想要这样做是因为当打开 CRM 表单时,浏览器会加载真正的 Xrm
依赖项。
这里的限制是必须在每个想要使用 Xrm
依赖项的方法中编写条件检查。如何克服这一点?
这是一个 link到有关 Xrm.Page 对象模型的文档。我的类和 Xrm 模拟是使用 @types/xrm 编写的.
我很感激我在这里问了多个问题,如果你认为你可以指导我写一个更具体的问题,请告诉我:)
最佳答案
为什么您会在 CRM 中调用 Contact.prototype.onLoad
方法,而不是调用以与您在测试中相同的方式实例化您的 Contact 类的方法,而是使用 CRM 的 Xrm
对象?例如
function ContactOnLoad() {
var contact = new Contact(Xrm);
contact.onLoad();
}
然后在表单的 OnLoad 处理程序中调用 ContactOnLoad
。如果您只是调用 Contact.prototype.onLoad
,this
可能引用您的窗口对象,而不是 Contact
的新实例。
关于typescript - 为 Dynamics CRM 编写可测试的 TypeScript 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44175818/