为Dynamics CRM编写可测试的TypeScript类

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