0

我日常工作的很大一部分涉及使用 Dynamics CRM 和编写 JS 来扩展表单上的功能。

Dynamics 中的大多数客户端交互都涉及在表单加载时使用为您提供的对象,即Xrm。所以你可能有类似的东西:

function OnLoad() {
    Xrm.Page.getAttribute('name').setValue('Stackoverflow!');
    var x = Xrm.Page.getAttribute('name').getValue();
}

我倾向于为 Xrm 对象编写一个包装器,主要是因为它比记住一些链接要容易得多,并最终得到如下内容:

function WrappedXrm(realXrm) {
    var xrm = realXrm;

    this.getValue(name) {
        return xrm.getAttribute(name).getValue();
    }
}

//and then use it as so

var myXrm = new FakeXrm(Xrm);
var myXrmValue = myXrm.getValue('Name');

我正在尝试QUnit,想知道在这种情况下我将如何进行单元测试?

显然上面的例子是一行,它可能不值得测试。但是假设那里有一些我想测试的业务逻辑。

我能看到的唯一方法是在每次测试之前按照以下方式进行一些设置

var fakeXrm = {};
fakeXrm.Page = {};
fakeXrm.Page.getAttribute = function(name) {
    var tempAttr = {};
    tempAttr.getValue = function() {
        return 'A fake value';
    }
}

然后在'A fake value'被退回时进行测试,但这对我来说根本不“感觉”。

我哪里错了?

4

1 回答 1

1

使用模拟

所以在这种情况下,你想创建一个 WrappedXrm 的实例,并从你的 lib 中传递一个模拟 Xrm 的对象;你需要一个 Xrm 的模拟。

第一种选择是像你一样编写它(如果你知道 Xrm 的接口是什么,这是完全有效的。)

jasmine 框架中的一些库(如 sinon.js 或“间谍”)可以帮助您编写如下代码;

  • 创建一个“模拟”Xrm,以配置它应该返回的内容
  • 用这个模拟创建一个 WrappedXrm 的实例
  • 调用 WrappedXrm 的 getValue 方法
  • 检查是否在模拟上调用了某些方法

但在 javascript 的情况下,简单地创建一个具有正确属性的对象可能没问题。

请注意,如果“真实”Xrm 对象的结构发生变化,您的测试将会中断;这可能是你的烦恼,但这总是模拟的风险......

使用真实的实现

如果您不想针对模拟进行测试(这在包装器的情况下可能有意义),那么也许您可以编写将在您的 qunit html 页面中创建实际Xrm 对象的最小代码(也许是硬编码标记?我不不知道图书馆,所以...)

希望这会有所帮助。

于 2013-01-23T16:39:16.727 回答