2017-02-03 3 views
1

In meinem Projekt verwende ich Winkelmesser + Jasmine + TypeScript für e2e Tests. Ich habe bereits von TypeScript Ruhm der Vererbung in meiner Seite Objektdateien profitieren (zum Beispiel habe ich einige BasePageObject Klasse mit gemeinsamen Methoden/Objekte, aus denen Rest von PageObjects abgeleitet sind). Ich möchte in meinen Tests den gleichen Ansatz vorstellen. Hier Beispielcode, die ich jetzt habe:Vererbung in e2e Tests [Jasmine, Winkelmesser, TypeScript]

Testsuite A [ATest.ts]:

import { 
    SomePage, 
    LoginPage 
} from '../pages'; 


describe('test suite A',() => { 
    let loginPage: LoginPage = new LoginPage(); 
    let somePage: SomePage = new SomePage(); 

    beforeAll(() => { 
     loginPage.login(); 
     somePage.navigateTo(); 
    }); 

    it('my test 1',() => { 
     //test body, assertions etc. 
    }); 

    it('my test 2',() => { 
     //test body, assertions etc. 
    }); 
}); 

Testsuite B [BTest.ts]:

import { 
    AnotherPage, 
    LoginPage 
} from '../pages'; 


describe('test suite B',() => { 
    let loginPage: LoginPage = new LoginPage(); 
    let anotherPage: AnotherPage = new AnotherPage(); 

    beforeAll(() => { 
     loginPage.login(); 
     anotherPage.navigateTo(); 
    }); 

    it('my test 1',() => { 
     //test body, assertions etc. 
    }); 

    it('my test 2',() => { 
     //test body, assertions etc. 
    }); 
}); 

Wie Sie sehen können , ein Teil des Codes ist für beide Suiten üblich. Was würde Ich mag ist Erbe in meinem TCses zu erreichen, um sie in Java Art zu schreiben und Code-Duplizierung (zum Beispiel) vermeiden:

class BaseTestCase { 
    beforeAll() { 
     loginAction(); 
    } 
} 

class TestA extends BaseTestCase { 
    beforeAll() { 
     specificStuff(); 
    } 
} 

class TestB extends BaseTestCase { 
    beforeAll() { 
     specificStuff(); 
    } 
} 

Ist es möglich, in Jasmin?

+1

können Sie einen Dienst erstellen, der beide bearblyAll –

+0

Die Frage fehlt Details. Werden 'loginPage' und' anotherPage' Variablen irgendwo anders verwendet? Wenn sie einmal pro Spezifikation instanziiert werden sollten, könnten sie in ein Modul verschoben werden und Singleton-Instanzen sein, nicht wahr? – estus

+0

Haben Sie eine gute Lösung dafür gefunden? Ich habe das selbe Problem/die gleiche Situation. –

Antwort

1

Sie könnten eine Basisklasse erstellen und diese ziemlich einfach erweitern und dann die Callbacks durch Funktionen ersetzen.

export abstract class BaseTest { 
    abstract loginAction(): void; 
    abstract specificStuff(): void; 
} 

export class FooTest extends BaseTest { 
    loginAction(): void { 
    // does stuff to login 
    } 
    specificStuff(): void { 
    // do tests and expectations 
    } 
} 

In Ihrem Test:

// Do some importing for FooTest. 

describe('test suite A',() => { 
    let fooTest = new FooTest(); 

    beforeAll(fooTest.loginAction); 

    it('should do some specific stuff', fooTest.specificStuff); 
}); 

Sollten Sie dies tun?

Es ist möglich, dies zu tun; Willst du das aber machen? Ich kann mir vorstellen, dass Ihre Klassenmethode FooTest einige Erwartungen an den Test stellt. Dies ist (meiner Meinung nach) kein gutes Muster zu folgen. Ihre it Blöcke sollten Ihre Erwartungen enthalten, anstatt sie herauszunehmen.

Verwandte Themen