2017-11-29 10 views
1

私はUI5でqUnitを使い慣れています。SAPUI5コアAPIを含む関数の単体テストの記述方法?

私は1つの機能をテストしたい

formatter.js

formatDate: function(sTimeStamp) { 
    if (sTimeStamp) { 
    var iTimeStamp = Number(sTimeStamp.match(/\d/g).join("")), 
     oDateTimeFormat = DateFormat.getDateTimeInstance(); 
    return oDateTimeFormat.format(new Date(iTimeStamp)); 
    } 
    return sTimeStamp; 
}, 

それのためのユニットテスト:明らかに

function formatDateTestCase(assert, sValue, fExpectedNumber) { 
    var fDate = formatter.formatDate(sValue); 
    assert.strictEqual(fDate, fExpectedNumber, "Format Date was correct"); 
} 

QUnit.test("Should return valid date", function (assert) { 
    formatDateTestCase.call(this, assert, "/Date(1510026665790)/", "Nov 7, 2017, 11:51:05 AM"); 
}); 

私は言語設定を変更する場合、このテストケースは失敗します。どのように改善する?


ここでの主な問題は、formatDateが副作用のある機能だと思います。私はこの機能自体を改善するべきですか? formatDateにロケールを追加しますか?

私のテストケースでDateFormatを使用する必要がありますか?それは私のテストを無意味にするでしょう。

+0

なぜUI5コア機能のテストケースを作成しますか?あなたのテストでは、SAPのコードが正しく動作すること(そしてそのAPIを理解していること)だけが証明されます。 – Marc

+0

@Marc、1.テストカバレッジ。 2.私はちょうどここで簡単な例を挙げました、 'DateFormat'を含む他の複雑なロジックがあるかもしれません、それをどのようにスタブするのですか? – Tina

答えて

3

あなたのコードを個別にテストできるようにするには、ここでDateFormatに電話をかけてください。だけあなた - - ユニット厳密ユニットテストのポイントを話す

ユニットテストの考慮事項

はあなたをテストすることです。依存するAPIはテストしないでください。一般的にそれについて論じることができますが、私はSAPUI5 APIをテストすることをお勧めしません。

一方、if文と無効なパラメータ(たとえばundefined)と無効な文字列を含むRegex部分をテストすることを強くお勧めします。これにより、フォーマッタは常に動作し、sthを返すことができます。空文字列の場合は意味があります。

Sinon.JS:モック、スタブとSpys

方法が予測値を返すように、あなたはあなたの特定のテストでDateFormat.getDateTimeInstance()スタブなければならない(例えばDateFormatにI18Nを考えるにあなたに別のテスト結果を与えるだろう異なる言語)。

SAPUI5には既にSinon.JSが含まれています(SAPUI5 1.44 - > Sinon.JS 1.14)。

sap.ui.define([ 
    "my/module/formatter", 
    "sap/ui/core/format/DateFormat", 
    "sap/ui/thirdparty/sinon", 
    "sap/ui/thirdparty/sinon-qunit" 
], function (formatter, DateFormat) { 

    QUnit.test("Should return valid date", function (assert) { 
    // stub the method 
    sinon.stub(DateFormat, "getDateTimeInstance"); 
    // ensure a predictable outcome 
    DateFormat.getDateTimeInstance.returns({ 
     format: function(oDate) { 
     return oDate.getTime(); 
     } 
    }); 

    var fDate = formatter.formatDate("/Date(1510026665790)/"); 
    assert.strictEqual(fDate, "1510026665790", "Format Date was correct"); 
    // Optional: test if the stubbed function was called 
    assert.ok(DateFormat.getDateTimeInstance.calledOnce); 

    // don't forget to restore the stub so that it does not interfere with other tests 
    DateFormat.getDateTimeInstance.restore(); 
    }); 

}); 

DateFormat.getDateTimeInstanceをスタブすることによって、あなたは、コアAPIとそれの成果をテスト停止し、あなたが最も重要なものに焦点を当てることができます:あなたのコードをここでは基本的な例です。

BR Chris

+0

'oDataModel.read/create/createEntry/update/remove'をスタブする必要がありますか? – Tina

+1

ユニットテストでバックエンドや特定のバックエンド応答に頼るべきではありません。あなたは模擬サーバーに行き、模擬データを修正することもできます。一般的には、シミュレートするよりも、それらのことを模擬するほうが簡単でしょう。単体テストへのあなたのアプローチにも少し左右されます(純粋な単体テストと単体テストとの統合テスト)。 – cschuff

関連する問題