2017-11-29 28 views
1

UIU5를 통해 qUnit을 처음 사용했습니다.SAPUI5 Core API가 포함 된 함수에 대한 단위 테스트를 작성하는 방법?

나는 그것을 하나 개의 함수를 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의 코드가 올바르게 작동한다는 것을 증명할뿐입니다. – Marc

+0

@Marc, 1. 테스트 커버리지. 2. 여기에 간단한 예를 들어봤을 때,'DateFormat'을 포함하고있는 다른 복잡한 논리가있을 수 있습니다. – Tina

답변

3

코드를 독립적으로 테스트하려면 여기 DateFormat으로 전화를해야한다고 생각합니다. 로만 - - 단위 엄밀히 단위 테스트의 요점을 말하기

단위 테스트 고려 사항

당신을 테스트하는 것입니다. 종속 API를 테스트해서는 안됩니다. 일반적으로 논쟁의 여지가 있지만 SAPUI5 API를 테스트하는 것은 권장하지 않습니다.

다른 한편으로는 if 문과 유효하지 않은 매개 변수 (예 : undefined)가있는 정규식 부분 및 유효하지 않은 문자열을 테스트하는 것이 좋습니다. 이렇게하면 포맷터가 항상 작동하고 sth를 반환합니다. 빈 문자열이면 의미가 있습니다.

Sinon.JS : 모의 객체, 스텁 및 Spys

방법은 예측 값을 반환하도록 당신이 (당신에게 다른 시험 결과를 줄 것이라고 DateFormat에서 국제화의 예를 생각하여 특정 테스트에 DateFormat.getDateTimeInstance() 스텁한다

다른 언어들).

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