2016-01-28 136 views
0

我有一個名爲wd $ cache的服務,基本上是localStorage.setItem和get.item的包裝。茉莉花和角嘲笑:嘲笑處理本地存儲的服務

現在我試圖測試一個控制器,使用該服務來實現特定的結果。主要的問題是,我有一個IF語句,只有當你已經設置了localstorage時纔會觸發IF語句,這會讓我瘋狂! (我們在這裏做TDD)

服務

(function() { 

angular 
    .module('hub') 
    .controller('promotionNotificationCtrl', promotionNotificationCtrl); 

promotionNotificationCtrl.$inject = [ 
    'hub$promotions', 
    'hub$client', 
    'wd$cache' 
]; 

function promotionNotificationCtrl(
    hub$promotions, 
    hub$client, 
    wd$cache) { 

    var vm = this; 
    activate(); 

    ////////// 

    function activate() { 

     hub$promotions.get(hub$client.brand, hub$client.subbrand).success(function (data) { 

      if (!wd$cache.get('hub$notification')) { 

       wd$cache.add('before', 123); 
      } else { 

       wd$cache.add('after', 321); 
      } 
     }); 
    } 
} 
})(); 

TEST

describe('The promotion notification controller', function() { 

var controller, 
    hub$client, 
    $httpBackend, 
    wd$cache, 
    mockData = [{ 

     "foo": "bar" 
    }, 
    { 
     "faa": "boo" 
    }]; 


beforeEach(module('hub')); 
beforeEach(module('wired.core')); 

beforeEach(module(function ($provide) { 

    hub$client = { 

     brand: 'bw', 
     subbrand: 'plus' 
    }; 

    wd$cache = { 

     add: function() { 

     }, 

     get: function() { 

     } 
    }; 

    $provide.value('hub$client', hub$client); 
    $provide.value('wd$cache', wd$cache); 
    spyOn(wd$cache, 'add'); 
})); 

beforeEach(inject(function ($controller, _$httpBackend_, _hub$promotions_) { 

    controller = $controller('promotionNotificationCtrl'); 
    $httpBackend = _$httpBackend_; 
    hub$promotions = _hub$promotions_; 

    // request 
    $httpBackend.expectGET("/umbraco/api/promotions/get/?brand=bw&lang=en&subbrand=plus").respond(200, mockData); 
    $httpBackend.flush(); 
})); 

it('should attempt to add a cache with a "before" key if no previous "hub$notification" cache was found', function() { 


    expect(wd$cache.add).toHaveBeenCalledWith('before', 123); //WORKING 
}) 

it('should attempt to add a cache with a "after" key if a previous "hub$notification" cache was found', function() { 

    localStorage.setItem('hub$notification'); 
    wd$cache.add('hub$notification'); 

    expect(wd$cache.add).toHaveBeenCalledWith('after', 123); // NOT WORKING 
    // CANT GET THROUGH THE IF STATEMENT 
}) 
}); 

基本上我可以永遠到不了BeforeEach塊後 '測試案例',無論我做什麼。我已經嘗試了一切,因爲它嘲笑它使用實際存儲。

任何想法?

+0

你可以發佈你在Karma測試運行者中得到的錯誤嗎? – Jagrut

+0

完全忘了! 預期wd $ cache.add被'after'調用,但實際調用'before',123 – DjayCi

回答

0

可以提供已經填充了一些數據模擬實現:

var cache = {};  

beforeEach(module(function ($provide) { 
    // ... 
    wd$cache = { 
     add: function (key, value) { 
      cache[key] = value; 
     }, 
     get: function (key) { 
      return cache[key]; 
     } 
    }; 

    // add initial data here or in the individual tests, e.g. 


    // ... 
})); 

要正確設置緩存爲特定的測試用例,你可以使用cache場這樣的:

cache['hub$notification'] = 'whatever value makes sense here'; 

當然你也可以在beforeEach中這樣做。

目前你正在嘗試做這樣的:

wd$cache.add('hub$notification'); 
expect(wd$cache.add).toHaveBeenCalledWith('after', 123); 

這是兩方面的原因存在問題:

  • ,因爲你是在add方法刺探沒有你不更新緩存.andCallThrough()。您應該修復此問題(間諜創建後添加.andCallThrough()),否則控制器的更新不會影響緩存。

  • 間諜記錄你的電話。你不希望這個設置代碼,因爲它使後續的斷言更復雜。

+0

只有當我設置cache ['hub $ notification'] = 123;在每個之前,這將使第一次測試休息,因爲有一個緩存可用!如果發現先前的「集線器$通知」高速緩存,則應該嘗試添加具有「之後」鍵的高速緩存,函數(){ wd $ cache.hub $ notification = 123; expect(wd $ cache.add).toHaveBeenCalledWith('after',123); }) – DjayCi

+0

這是一個愚蠢的評論!但基本上,通過這樣做,你最終只能完成其中的一個陳述,因爲獲得這個工作的唯一方法是將它放在每個之前! – DjayCi

+0

只需將'var cache = {}'移動到外部範圍。然後,您可以修改每個單獨測試中的緩存內容,而不僅僅是在'beforeEach'之前。 – lex82