W

JavaScript – Rendere testabile codice già esistente ma NON testabile

Sono appena “caduto” su codice JS scritto in questo modo:

angular.element(document).ready(function () {
    // Fatto così è un casino da testare!!
    angular.module("ModuloPerCostanti", [])
        .constant("parametri",
        {
            costanteUno: $("#parameters").data("costante-uno"),
            costanteDur: $("#parameters").data("costante-due")
        });

    angular.module("ModuloPrincipale", ["ModuloPerCostanti", "ModuloPerServizi", "ModuloPerDirettive", "ngSanitize", "ngResource"])
        .filter("filtroUno", function () {
            return function (data) {
               //DoSomething
            }
        })
        .filter("formatPrezzo", function () {
            return function (data) {
                //DoSomething                
            };
        })
        .controller("ControllerPrincipale", ["$rootScope", "$scope", "$http", function ($rootScope, $scope, $http) {
                // DoSomething
        }])
        .controller("ControllerSecondario", ["$rootScope", "$scope", "$compile", "$http", "$window", "$timeout", "$filter", "$sce", function ($rootScope, $scope, $compile, $http, $window, $timeout, $filter, $sce) {
            //DoSomething
        });
});

Scritto in questo modo, non sarà testabile a meno di scatenare l’evento “documentReady” e far inizializzare i moduli, i controller, i filtri, le direttive etc… (cfr: http://bittersweetryan.github.io/jasmine-presentation/#slide-17)

Questo perché? Jasmine (framework JavaScript utilizzato per il testing) carica i moduli angular in questo modo:

angular(“ModuloPerCostanti”) // Cercherà ma non troverà il modulo ModuloPerCostanti

angular(“ModuloPrincipale”) // Cercherà ma non troverà il modulo ModuloPrincipale

Purtroppo Jasmine non troverà alcun modulo, perché quella parte di codice, che definisce i moduli, viene avviata solo durante l’evento document.ready.

Il codice è scritto in quel modo perché dipende dell’HTML della pagina, in particolare la parte di “constant” richiede che il documento sia completamente caricato (di fatto quelle non sono costanti… se fosse C# non ci permetterebbe mai di compilare come costante qualche cosa di non noto a compile time); tralasciando tutto questo, come renderlo testabile senza stravolgerlo? (tenete conto che quando bisogna “rendere testabile” un codice qualcosa non funziona; test a parte, significa che stiamo usando un approccio poco lineare difficile da capire, manutenere e non è detto funzioni sempre).

Basta un piccolissimo accorgimento,utilizzando la notazione dei NameSpace javascript, in modo da minimizzare possibli conflitti:

  1. Dichiariamo il nostro nameSpace
  2. Creiamo una funzione Init che contenga tutto il nostro codice, con la notazione dei NameSpace:
    var NostroNameSpace; // Dichiariamo ma non inizializziamo il namespace
    (function(tempNameSpace){ // Funzione anonima autochiamante
        tempNameSpace.Init = function(){ // al parametro tempNameSpace viene agganciata la funzione Init
        angular.module("ModuloPerCostanti", [])
            .constant("parametri",
            {
                costanteUno: $("#parameters").data("costante-uno"),
                costanteDur: $("#parameters").data("costante-due")
            });
    
        angular.module("ModuloPrincipale", ["ModuloPerCostanti", "ModuloPerServizi", "ModuloPerDirettive", "ngSanitize", "ngResource"])
            .filter("filtroUno", function () {
                return function (data) {
                   //DoSomething
                }
            })
            .filter("formatPrezzo", function () {
                return function (data) {
                    //DoSomething                
                };
            })
            .controller("ControllerPrincipale", ["$rootScope", "$scope", "$http", function ($rootScope, $scope, $http) {
                    // DoSomething
            }])
            .controller("ControllerSecondario", ["$rootScope", "$scope", "$compile", "$http", "$window", "$timeout", "$filter", "$sce", function ($rootScope, $scope, $compile, $http, $window, $timeout, $filter, $sce) {
                //DoSomething
            });
    };
    })(NostroNameSpace || (NostroNameSpace = {})); // Se NostroNameSpace non è già stato istanziato, viene qui inizializzato ad un oggetto vuoto, altrimenti sarebbe <em>undefined</em>
    
  1. Richiamiamo l’unica funzione NostroNameSpace.Init così: angular.element(document).ready(NostroNameSpace.Init); // Di nuovo usiamo il document ready

Cosa cambia?

In Jasmine, a questo punto, faremo così:

NostroNameSpace.Init();

angular(“ModuloPerCostanti”) // Cercherà e caricherà il modulo ModuloPerCostanti

angular(“ModuloPrincipale”) // Cercherà e caricherà il modulo ModuloPrincipale

Il codice è stato rifattorizzato in maniera molto semplice, ma in questo modo possiamo testare tutto (circa 5/10 minuti di refactor, più che altro per stare attenti a non introdurre errori).

Share Button
 
W

msb4126 and OrchardCms

If you got here, probably you have just tried to build OrchardCms and got this error:
The specified solution configuration “Debug|MCD” is invalid
Maybe your laptop is an HP? It happens that on HP Laptops the Environment variable Platform is set to MCD
The solution is very easy, indeed… just go to System Properties -> Advance System Configuration -> Environment Variables and then change the value to Any CPU

variabili ambiente

Done! You can now build OrchardCms with “Build precompiled” from Visual Studio command prompt
Solution found here

Share Button
 
W

VisualStudio 2008 e UserControl spariti

in Tips & Tricks , by LoreX75

Vi è mai capitato di creare UserControls nella vosta Soluzione (.sln) di Visual Studio 2005 e non vederli nella ToolBox, oppure vederne solo alcuni?
Bene, ieri ho scoperto, dopo più di un’ora di navigazione, il problema e la sua, semplice, soluzione

Il fattattio accade se il progetto che contiene gli UserControls è contenuto, a sua volta, in una cartella della suluzione (pe rintenderci: click col pulsante destro su "Solution" e poi "Add" + "New Solution Folder"): tutti i progetti che si trovano all’interno di una di queste cartelle verranno ignorati, cioè VisualStudio non ne visualizzerà gli UserControl nella ToolBox.

Mamma mia, quanta pazienza ci vuole, a volte 😉

Share Button
 
W

World Of Warcraft e Vista

in Giochi, Tips & Tricks , by LoreX75

Allora, mi sono scontrato con un bel buggino, non so bene attribuibile a chi, se a WOW o a Vista.

Nel caso vogliate installare un plugin per WOW preparatevi per la sorpresa: la directory Intefrace è vuota, senza nulla dentro.

Non ho ancora capito perchè succeda tutto questo, penso sia una questine di chi sia ad impersonare il processo che crea gli elementi di quella directory, ma è solo una mia teoria.

La soluzione più semplice, comunque, è spostare la directory di installazione di WOW e non lasciarla in Programmi; personalmente l’ho messa sul Desktop e poi su un altro disco, e ha sempre funzionato a meraviglia; in caso di nuove installazioni, consiglio di non accettare l’impostazione di default e di scegliere una directory alternativa che non sia contenuta in Programmi o Program Files.

Share Button
Tagged with: