2014-01-07 9 views
12

Ich habe eine sehr einfache Richtlinie, dessen Zweck es ist nur die dragstart Veranstaltung abzusagen:Pass Mock DOM Event-Handler-Richtlinie ohne jQuery

link: function(scope, element) { 
    element.on('dragstart', function(e) { 
    e.preventDefault(); 
    }) 
} 

Wie kann ich dies in einem Test Jasmin testen? Ich habe den folgenden Test, der auf einem Ereignisobjekt auszuspionieren versucht, und übergeben es an den Handler:

var mockEvent; 

beforeEach(function() { 
    mockEvent = new Event('dragstart'); 
    spyOn(mockEvent,'preventDefault'); 
}); 

it('should call preventDefault', function() { 
    element.triggerHandler('dragstart', mockEvent); 
    expect(mockEvent.preventDefault).toHaveBeenCalled(); 
}); 

Aber der Test nicht bestanden. Sie können see this at this Plunker.. Wie kann ich das testen (/ refactor die Richtlinie, um es testbar zu machen)?

Bearbeiten: Idealerweise ohne jQuery. Bearbeiten: geänderte Tags

Antwort

8

bei der aktuellen stabilen Version von Angular, 1.3.14, können Sie, indem man das Ereignis als erster und einzigen Parameter von triggerHandler, so statt dies ohne jQuery tun, was in der Frage

element.triggerHandler('dragstart', new Event('dragstart')); 

vorgeschlagen wurde können Sie schreibe

element.triggerHandler(new Event('dragstart')); 

Um einen Spion auf dem preventDefault Funktion, gemäß der ursprünglichen Frage hinzufügen, erhalten Sie folgende

var mockEvent; 

beforeEach(function() { 
    mockEvent = new Event('dragstart'); 
    spyOn(mockEvent, 'preventDefault'); 
}); 

it('should call preventDefault', function() { 
    element.triggerHandler(mockEvent); 
    expect(mockEvent.preventDefault).toHaveBeenCalled(); 
}); 

Sie können tun können see this working in this Plunker. Alternativ können Sie verwenden nur ein einfaches Objekt mit mindestens einem type Schlüssel, so dass in diesem Fall

mockEvent = { 
    type: 'dragstart', 
    preventDefault: jasmine.createSpy('preventdefault') 
}; 

die working in this Plunker gesehen werden kann

Ich glaube, das auf den 1.3 Zweig in this commit aufgenommen.

+0

Bitte bearbeiten Sie Ihren Titel oder Ihre Antwort, um Angular anzugeben. Andere, die nach JavaScript-Lösungen von Vanilla suchen, landen hier. –

+0

@NachoColoma Sie können Änderungen vornehmen! –

10

Sie können jquery einschließen und ein jquery-Ereignisobjekt erstellen. Diese Aufgabe kann easly geben werden:

beforeEach(function() { 
    mockEvent = $.Event('dragstart'); 
    spyOn(mockEvent,'preventDefault'); 
}); 

it('should call preventDefault', function() { 
    element.triggerHandler(mockEvent); 
    expect(mockEvent.preventDefault).toHaveBeenCalled(); 
}); 

ich diese jquery Version in Ihrem plunkr verwendet haben: //ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js

+0

Ich habe jQuery hinzugefügt und den Test unter http://plnkr.co/edit/aRvgHQXPTCSvlXougxHX?p=preview geändert, aber der Test schlägt immer noch fehl. –

+0

element.triggerHandler (mockEvent); nicht element.triggerHandler ('dragstart', mockEvent); – michael

+0

Ah, das funktioniert, einschließlich der Änderung von '$ .Event' zu' new Event', wie unter http://plnkr.co/edit/2LrrEBjVjftXH5ueprLI?p=preview zu sehen ist. Gibt es eine Möglichkeit, dies ohne jQuery zu tun? –