2017-05-10 6 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

まあ、それは不変だとしてあなたはdocument.cookiesプロパティを模擬することができない上、実際にあなたすることはできませんモックSinonとプロパティともっと。しかし、あなたができることは、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」のゲッターとセッターを再定義する必要ブラウザの回避策があります:

(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); 
関連する問題