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を試していますが、このシナリオでユニットテストをどのように行うのでしょうか。

明らかに、上記の例は1行なので、テストする価値がない場合があります。しかし、テストしたいビジネスロジックがそこにあったと仮定します。

私が見ることができる唯一の方法は、各テストの前にいくつかのセットアップを行うことです。

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のインターフェースが何であるかを知っているなら、これは完全に有効です)。

sinon.jsやjasmineフレームワークの「spies」などの一部のライブラリは、;のようなコードの記述に役立ちます。

  • 'モック'Xrmを作成して、何を返すかを構成します
  • このモックでWrappedXrmのインスタンスを作成します
  • WrappedXrmのgetValueメソッドを呼び出します
  • モックで何らかのメソッドが呼び出されたことを確認してください

ただし、javascriptの場合は、適切なプロパティを持つオブジェクトを作成するだけで問題ない場合があります。

「実際の」Xrmオブジェクトの構造が変更されると、テストが失敗することに注意してください。それはあなたを悩ませているかもしれませんが、それは常にモックのリスクです...

実際の実装を使用する

モック(ラッパーの場合は意味があるかもしれません)に対してテストしたくない場合は、 qunit htmlページに実際のXrmオブジェクトを作成する最小のコードを記述できます(マークアップをハードコーディングしている可能性がありますか?私はしません)ライブラリがわからないので...)

これがお役に立てば幸いです。

于 2013-01-23T16:39:16.727 に答える