2012-08-13 3 views
33

Es gibt viele Dokumente, die zeigen, wie man einen Matcher zu einer Jasmine-Spezifikation (z. B. here) hinzufügt.Gibt es eine Möglichkeit, der gesamten Umgebung einen Jasmine-Matcher hinzuzufügen?

Hat jemand einen Weg gefunden, Matcher zu der gesamten Umgebung hinzuzufügen; Ich möchte eine Reihe nützlicher Matcher erstellen, die von allen Tests aufgerufen werden können, ohne dass ich alle meine Spezifikationen kopieren muss.

Gegenwärtig arbeiten, um die Quelle zurückzuentwickeln, aber würde eine bewährte Methode bevorzugen, wenn eine existiert.

Antwort

47

Sicher, rufen Sie einfach beforeEach() ohne irgendwelche Spezifikationsüberlegungen überhaupt, und fügen Sie Matcher dort hinzu.

Dies würde global einen toBeOfType Matcher hinzufügen.

beforeEach(function() { 
    var matchers = { 
    toBeOfType: function(typeString) { 
     return typeof this.actual == typeString; 
    } 
    }; 

    this.addMatchers(matchers); 
}); 

describe('Thing', function() { 
    // matchers available here. 
}); 

Ich habe eine Datei gemacht spec_helper.js voller Dinge wie benutzerdefinierte Matcher genannt, die ich brauche nur auf der Seite zu laden, bevor ich den Rest der Spec-Suite laufen.

+1

Ich fand auch ein schönes Beispiel hier: http://tobyho.com/2012/01/30/write-a-jasmine-matcher/ – Dancrumb

+0

I Link von Dancrumb geteilt versucht, im Idealfall seinen ordentlichen und sauberen Ansatz aber es hat nicht funktioniert, also adoptierte ich Alex. – joy

+2

Ist hier ein für Jasmin 2.0+ '' '' Javascript before (function() { jasmine.addMatchers ({ toEqualData: function() { return { vergleichen: function (tatsächliche, erwartete) { return { pass: angular.equals (tatsächlich, erwartet)} } } } }); }); '' '' – mikker

12

Ist hier ein für Jasmin 2.0+:

beforeEach(function(){ 
    jasmine.addMatchers({ 
    toEqualData: function() { 
     return { 
     compare: function(actual, expected) { 
      return { pass: angular.equals(actual, expected) }; 
     } 
     }; 
    } 
    }); 
}); 

Beachten Sie, dass diese angular.equals Winkel des verwendet.

+0

Dies funktioniert nicht für mich .. Schreiben von Vergleichen Argumente ist immer ein leeres Objekt. –

+1

Das ist die Antwort, nach der ich gesucht habe! –

0

Edit: Ich wusste nicht, es war eine interne Implementierung, die Änderungen unterzogen werden können. Benutzung auf eigene Gefahr.

jasmine.Expectation.addCoreMatchers(matchers) 
0

Basierend auf früheren Antworten, habe ich die folgende Einstellung für Winkel-cli. Ich brauche auch ein externes Modul in meinem Matcher (in diesem Fall moment.js)

Hinweis In diesem Beispiel habe ich eine equalityTester hinzugefügt, aber es sollte

Erstellen Sie eine Datei mit src/spec_helper.ts die mit einem Kunden Matcher arbeiten folgender Inhalt:

// Import module 
import { Moment } from 'moment'; 

export function initSpecHelper() { 

    beforeEach(() => { 
    // Add your matcher 
    jasmine.addCustomEqualityTester((a: Moment, b: Moment) => { 
     if (typeof a.isSame === 'function') { 
     return a.isSame(b); 
     } 
    }); 
    }); 

} 

Dann in src/test.ts importiert die initSpecHelper() Funktion es hinzufügen auszuführen. Ich habe es vor Angulars TestBed init platziert, was gut zu funktionieren scheint.

import { initSpecHelper } from './spec_helper'; 

//... 

// Prevent Karma from running prematurely. 
__karma__.loaded = function() {}; 

// Init our own spec helper 
initSpecHelper(); 

// First, initialize the Angular testing environment. 
getTestBed().initTestEnvironment(
    BrowserDynamicTestingModule, 
    platformBrowserDynamicTesting() 
); 

//... 
Verwandte Themen