2017-04-15 10 views
0

最近ジャスミンを使い始めました。私は奇妙な状況に陥っています。別の関数呼び出しでDOM操作を行う関数をテストしています。ジャスミンは、elem.classNameがコンストラクタではないと言ってエラーを投げています。ここに私のコードの構造は、次のとおりです。スタブジャスミンのDOM要素、angularjs

コントローラーコード:

function resetElem(elem) { 
    elem.classList.remove(/some string/); 
} 

function a() { 
    resetElem(document.getElementsByClassName('xx')[0]) 
} 

ジャスミン:

var elem; 

beforeEach(inject(function($rootScope, $controller, $q) { 
    deferred = $q.defer(); 
    scope = $rootScope.$new(); 

    mockHTMLElements(); 
    createController($controller); 
})); 

function mockHTMLElements() { 
    /* //This was the other method that I tried. 
    jasmine.spyOn(document, 
    'getElementsByClassName').and.CallFake(function(name) { 
     var el; 
     if (!elems[name]) { 
     el = document.createElement('div'); 
     el.className = name; 

     elems[name] = el; 
     } 

     return [elems[name]]; 
    }); 
    */ 

    elems['preview-promo'] = document.createElement('div'); 
    elems['preview-promo'].className="preview-promo"; 

    elems['create-promo'] = document.createElement('div'); 
    elems['create-promo'].className="create-promo"; 

    elem = { 
    classList : { 
     add : jasmine.createSpy('add'), 
     remove : jasmine.createSpy('remove'), 
    }, 
    className : 'test' 
    }; 
} 

it('tests the a function', function() { 
    // vm is ref of this of controller 
    vm.a(true); 
    ...some other tests 
}); 

コンソールが

TypeError: undefined is not an object (evaluating 'elem.classList') 

この権利を作成する方法がわからない

を返します。

答えて

1

提供された情報であなたに良い答えを与えることは困難です。

原則として、コントローラからDOMを操作しないでください。代わりにディレクティブを作成すると、DOM要素にアクセスできるようになり、テストがより簡単になり、より自然に書くことができます。

+0

私はネットワークリクエストが行われたときに条件付きで 'progress'クラスを追加しています。私は指示を作ることができるかどうか分からない。ディレクティブのリンク関数を条件付きで呼び出す方法を教えてください。 –

+0

あなたはしません。バインディングを使用すると、現在のスコープからCSSクラスを制御できます。 –

+0

はそれを撃つでしょう。 –