TypeScript + jasmine unit testy   zodpovězená otázka

Testování, JavaScript

Ahoj,

chtěl by jsem se vás zeptat, jak mám otestovat např. třídu pomocí jasmine

class Route implements ng.route.IRoute {
public url: string;
public config: RouteConfig;

constructor(url: string, config: RouteConfig) {
            this.url = url;
            this.config = config;
        }

public hasChildRoutes(): boolean {
            return this.config.childRoutes.length > 0;
        }

Můj test vypadá následovně (v zásadě je špatně, protože vytvářím instance jiných objektů a o to mi de, jak mám udělat to, aby jsem mu podstrčil nějaký fake objekt):


beforeEach(() => {
            routeSetting = new RouteSetting(1, '');
            routeConfig = new RouteConfig('', '', routeSetting, [], '');
        });


        describe('Testy metod třídy', () => {
            var childRoute: Route;
          
            beforeEach(() => {
                route = new Route('', routeConfig);
            });

            it('mělo by vrátit false, když route nemá child routy', () => {
                expect(route.hasChildRoutes()).toBeFalsy();
            });

            it('mělo by vrátit true, když route má child routy', () => {
                routeConfig = new RouteConfig('', '', routeSetting, [route], '');
                route = new Route('', routeConfig);

                expect(route.hasChildRoutes()).toBeTruthy();
            });
        });
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechápu, co máte na mysli tím "v zásadě je špatně, protože vytvářím instance jiných objektů a o to mi de, jak mám udělat to, aby jsem mu podstrčil nějaký fake objekt".

Jaký fake objekt? Místo čeho?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, ta věta je zmatená. Nechtěl jsem v unit testu testované třídy (to jest Route) mít instanci třídy jiné, ale bylo mi řečeno, že tento postup je zcela korektní. Další korektní postup je si vytvořit mock/stub/spy objekt, pomocí kterých se test vyhodnotí. V tomto konkrétním případě jsem test napsal takto:

describe('Testy metod třídy', () => {

            it('mělo by vrátit false, když route nemá child routy', () => {
                // arrange
                var routeCfg: any = sinon.stub();
                routeCfg.childRoutes = [];

                // act
                route = new Route('', routeCfg);

                //assert
                expect(route.hasChildRoutes()).toBeFalsy();
            });

            it('mělo by vrátit true, když route má child routy', () => {
                // arrange
                var routeCfg: any = sinon.stub();
                routeCfg.childRoutes = [];
                routeCfg.childRoutes.length = 1;

                //act
                route = new Route('', routeCfg);

                //assert
                expect(route.hasChildRoutes()).toBeTruthy();
            });
        });

co na tento postup říkáte pane Herceg? Jak by jste napsal test vy? Děkuji za odpověď :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemůžu posoudit, jestli ty testy jsou v pořádku, nevím, co přesně testujete - přijde mi, že jde o tak jednoduchou věc, že na ní testy ani potřeba nejsou, ale to je fuk, to už poznáte sám.

Každopádně funguje to tak, že pokud chcete testovat třídu Route, tak na ní dělat mock nemůžete.

Mockování se používá v případě, že chcete testovat třídu A, která používá třídu B, a ta třída B se nemůže použít v těch testech. Tak se místo B použije BMock, ale pořád se to testuje na třídě A.

Testujete vždy reálnou třídu, a ta reálná třída místo některých svých závislostí může mít mock objekty, ale vždycky testujete reálnou třídu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, že testuji jednoduchou věc - spíše se jedná o vyzkoušení testování na jednoduchých věcech, než se pustím do složitějších. Co se týče Vašich posledních vět, tak to můj test splňuje,

vytvářím Stub třídy RouteConfig, kterou konstruktor třídy Route bere jako vstupní parametr viz sekce "arrange":

// arrange
var routeCfg: any = sinon.stub();
routeCfg.childRoutes = [];
routeCfg.childRoutes.length = 1;

a testuji reálnou třídu viz sekce "act" a "assert":

//act
route = new Route('', routeCfg);

//assert
expect(route.hasChildRoutes()).toBeTruthy();

Děkuji za pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback