2017-05-10 15 views
1

는이 코드가 있습니다QUnit과 Sinon에서 쿠키를 모방하는 방법은 무엇입니까?

var CookieHelper = function() { 
    return { 
     GetCookie : function (cookieName) { 
      var cookieNameRequest = cookieName + "="; 
      var cookiesCollection = document.cookie.split(";"); 
      for (var i = 0; i < cookiesCollection.length; i++) { 
       var cookieValuePair = cookiesCollection[i]; 
       while (cookieValuePair.charAt(0) == " ") cookieValuePair = cookieValuePair.substring(1, cookieValuePair.length); 
       if (cookieValuePair.indexOf(cookieNameRequest) == 0) 
        return cookieValuePair.substring(cookieNameRequest.length, cookieValuePair.length); 
      } 
      return null; 
     }, 

     DeleteCookie : function (cookieName) { 
      CookieHelper.SetCookie(cookieName, "", -1); 
     }, 

     SetCookie : function (cookieName, cookieValue, cookieExpirationDays) { 
      var tmpDate = new Date; 
      if (cookieExpirationDays) { 
       tmpDate.setTime(tmpDate.getTime() + cookieExpirationDays * 24 * 60 * 60 * 1000); 
       var expires = "; expires=" + tmpDate.toGMTString(); 
      } else { 
       // if cookieExpirationDays isn't set cookie will expire at the end of the day 
       var expirationTime = new Date(tmpDate.getFullYear(), tmpDate.getMonth(), tmpDate.getDate(), 23, 59, 59); 
       var expires = "; expires=" + expirationTime.toGMTString(); 
      } 
      document.cookie = cookieName + "=" + cookieValue + expires + "; path=/;" + (location.protocol === "https:" ? "secure=true" : ""); 
     } 
    }; 
}(); 

을 나는의 getCookie에 대한 단위 테스트를 작성해야합니다. 내가/스텁 document.cookie를 조롱 필요하지만 Sinon 및 QUnit 완전히 새로운 오전

QUnit.module('Cookie Helper Tests'); 

QUnit.test('GetCookie - returns no cookie', function(assert) { 
    var stub = sinon.spy(CookieHelper, 'GetCookie'); 

    var cookieName = 'testCookieName'; 
    var cookieValue = CookieHelper.GetCookie(cookieName); 

    assert.ok(cookieValue == null, 'returns no cookie');  
}); 

:
나는 함께했습니다.
누군가 내가 잘못한 것을 설명해 줄 수 있습니까?

미리 감사드립니다.
Srdjan

+0

, 아무 문제가 없다 :) 정확하게 알고 싶은 것은 무엇입니까? 스텁에서 응답을 반환하는 방법? 구체적으로 기재하십시오. – spilio

+0

나는 document.cookie를 호출하기를 원하지 않는다. 이것은 브라우저마다 다르므로. –

+0

그래서 문서 속성을 스텁하는 방법을 찾아야합니다. –

답변

1

그럼 실제로 할 수있는 모의하지 Sinon와 속성과 불변의대로 document.cookies에게 속성을 조롱 할 수없는 이상 더. 그래도 할 수있는 일은 here과 같이 원본 객체의 동작을 모방 한 가짜 이중 객체를 사용하는 것입니다. 당신이 (NodeJS에서 예) 브라우저 외부에서 동일한 테스트를 실행 한 경우

예를 들어, 당신은 상황과 모방에 문서 개체를 도입하기 위해 그

const chai = require('chai'); 
const sinon = require('sinon'); 
const SinonChai = require('sinon-chai'); 

chai.use(SinonChai); 
chai.should(); 

context('test', function() { 


    it('should pass', 
    (done) => { 

     var cookieName = 'testCookieName'; 

     document = { 
     cookie: cookieName + '=123' 
     }; 

     var cookieValue = CookieHelper.GetCookie(cookieName); 

     console.log(cookieValue); 

     done(); 
    }); 

}); 

과 같이 할 것 고정 된 결과를 반환하여 쿠키 속성입니다.

이제

는 설명 here으로 'document.cookie를'의 getter와 setter를 재정의 포함 브라우저에 대한 해결 방법이 있습니다 : 그것은 통과 이후 테스트 결과에 따르면

(function (document) { 
    var cookies = {}; 
    document.__defineGetter__('cookie', function() { 
     var output = []; 
     for (var cookieName in cookies) { 
      output.push(cookieName + '=' + cookies[cookieName]); 
     } 
     return output.join(';'); 
    }); 
    document.__defineSetter__('cookie', function (s) { 
     var indexOfSeparator = s.indexOf('='); 
     var key = s.substr(0, indexOfSeparator); 
     var value = s.substring(indexOfSeparator + 1); 
     cookies[key] = value; 
     return key + '=' + value; 
    }); 
    document.clearCookies = function() { 
     cookies = {}; 
    }; 
})(document);