2014-05-06 82 views
0

我正在嘗試對角度指令進行單元測試。因此,這是代碼:Angular.js UNIT測試指令

describe('Test', function() { 

    var element, 
     scope; 

    // load the service's module 
    beforeEach(module('app')); 


    beforeEach(inject(function ($compile, $rootScope) { 
    scope = $rootScope.$new(); 
    element = angular.element('<div id="wow"></div>'); 
    $compile(element)(scope); 
    element.scope().$apply(); 
    })); 

    it('should', function() { 
    console.log(document.getElementById('wow')); 
    }); 

}); 

我在控制檯得到null

當然這只是一個測試案例。在真正的代碼getElementById是由我的指令包裝,這是我試圖測試的插件使用。

所以我的問題是:爲什麼只編譯的DOM元素不能被getElementById找到。如果這是正確的行爲,我該如何避免這個錯誤。

謝謝

+2

元素是否附加到文檔?我認爲你需要自己動手 – javaCity

+0

但是放置元素的位置如果我沒有手動添加它? –

+0

它在記憶中.. – javaCity

回答

2

您需要在文檔的某處附加元素。這裏的工作是plnk

angular.element(document.body).append(element);

1

的DOM元素沒有找到,因爲茉莉花實際上從未附加到DOM:

唯一的事情,我補充道。如果你想獲得元素,只需將其稱爲元素即可。例如:

it('should', function() { 
    expect(element.attr('id')).toBe('wow'); 
}); 

您可以將元件連接到手動DOM,但記得要刪除它,當你與你的測試做了(我用的是afterEach塊這一點)。 Jasmine在整個測試套件中使用相同的DOM,因此如果您忘記刪除元素,則可能會在您的測試中得到錯誤肯定或其他意想不到的結果,這些結果來自您不期望在DOM中的元素。一般來說,除非您正在測試某些交互(模糊不需要附加到DOM,但例如焦點不在),否則您不應該將元素附加到DOM。

+0

這是一個比較合適的答案。如果你必須附加一些東西到DOM,那麼在E2E測試中做,而不是單元測試。 – Scottux