Přepsat výchozí vlastnosti pomocí JavaScriptu

Testování jednotek pomocí JavaScriptu na straně klienta je něco, co neděláte, dokud k tomu nebudete připraveni. Testování jednotek je samozřejmě důležité, ale buďme upřímní: Většina lidí je prostě ráda, že jejich kód funguje, že? V každém případě rychle vpřed do světa, kde je testování jednotek normální a my musíme vyřešit problém: přepisování nativních hodnot vlastností prohlížeče kvůli testování jednotek. Následuje jednoduchá strategie pro přepsání výchozích hodnot vlastností prohlížeče!

JavaScript

Nelze úspěšně přepsat všechny vlastnosti jednoduchým příkazem; použijme navigator.userAgent například:

console.log(navigator.userAgent);
// >> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

// Try to set that value -- will be unsuccessful
navigator.userAgent = 'Walshbot';

console.log(navigator.userAgent);
// >> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

Přepsání navigator.userAgent mohou být užitečné pro účely testování jednotek a funkcí, jak tedy můžeme tuto hodnotu úspěšně změnit? S Object.defineProperty :

// Store the original value
var originalUserAgent = navigator.userAgent;

// Override!
Object.defineProperty(navigator, 'userAgent', {
    get: function() {
        return 'WalshBot';
    }
});

// (Run your tests here)

// Set the value back to original
Object.defineProperty(navigator, 'userAgent', {
    get: function() {
        return originalUserAgent;
    }
});

Ve výše uvedeném úryvku uložíme původní Object.defineProperty hodnotu, krátce ji přepište a poté nastavte hodnotu zpět na původní. Object.defineProperty je velmi užitečná, zvláště když uvážíte, že druhý argument je funkce – můžete v rámci této funkce spustit libovolnou logiku a vrátit správnou hodnotu v okamžiku, kdy je požadována!