typescript - 为 Dynamics CRM 编写可测试的 TypeScript 类

标签 typescript testing dependency-injection dynamics-crm crm

如何使用 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.onLoadthis 可能引用您的窗口对象,而不是 Contact 的新实例。

关于typescript - 为 Dynamics CRM 编写可测试的 TypeScript 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44175818/

相关文章:

dependency-injection - Dagger2 注解处理器是否支持 Eclipse 增量编译器?

javascript - typescript 未生成正确的 system.register

java - 使用 mockito 将模拟注入(inject)抽象类

javascript - 事件类型字段的 Typescript 事件处理函数 - 上下文不正确

javascript - 如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?

typescript - 连接蓝牙模块后丢失数据

python - 在另一个函数中调用的模拟类方法

javascript - 如何在运行时检查类的字段是否允许为 null/未定义,以验证 JSON?

node.js - 通过多次调用计算异步函数的执行时间

java - jacoco 测试报告不排除包