2011-11-18 8 views
6

moich testów nie powiedzie się z następującego powodu:Jak napisać test jaśminowy dla metody zawierającej zmienną globalną z innej klasy/pliku?

ReferenceError: Can't find variable: moving_canvas_context in file (line 5)

Rozumiem powód test zakończył się niepowodzeniem. Nie rozumie tej zmiennej, ponieważ jest ona zdefiniowana w oddzielnym pliku javascript. Jest jednak deklarowana globalnie i działa w rzeczywistości.

Jak napisać test jaśminowy dla tej funkcji clear_canvas?

JavaScript Canvas_actions:

(function() { 
    window.Canvas_Actions = (function() { 
    function Canvas_Actions() {} 
    Canvas_Actions.prototype.clear_canvas = function() { 
     moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height); 
     main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height); 
     return window.canvas_objects = []; 
    }; 
    return Canvas_Actions; 
    })(); 
}).call(this); 

Jasmine Test Canvas_actions:

(function() { 
    describe('Canvas Actions', function() { 
    return describe('clear_canvas', function() { 
     return it('clears the canvases and deletes all objects', function() { 
     var actions; 
     jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures"; 
     loadFixtures("canvas_fixture.html"); 
     actions = new Canvas_Actions(); 
     actions.clear_canvas(); 
     return expect(canvas_objects).toEqual([]); 
     }); 
    }); 
    }); 
}).call(this); 

Odpowiedz

8

it is declared globally and works in reality

Cóż, też musi to być uznane, gdy przebiegi testowe. Prawdopodobnie brakuje ci odwołania do skryptu, który jest zdefiniowany w html urządzenia testującego.

Ponadto zmienne globalne zwykle nie są dobrym pomysłem, mają tendencję do tworzenia trudnych błędów. Ponieważ już używasz jaśminu jako ramy testowania, spróbuj wyodrębnić zależność od tej globalnej zmiennej w coś, co przekazujesz testowanemu kodowi. Następnie użyj szyderczych umiejętności jaśminu, aby go przetestować.

Jeśli usunięcie odniesień globalnych z Canvas_Actions, może to wyglądać tak:

var Canvas_Actions = function(canvas) { 
    this.canvas = canvas; 
} 
Canvas_Actions.prototype.clear_canvas = function(background_image) { 
    var canvas = this.canvas; 
    canvas.getContext().clearRect(0, 0, canvas.width, canvas.height); 
    canvas.getContext().drawImage(background_image, 0, 0, canvas.width, canvas.height); 
    canvas.clearObjects(); 
}; 

Można kpić z canvas argument z jaśminu i testu Canvas_Actions w izolacji.

Jak można zauważyć, ten kod może Unearth klasa Canvas, a może okaże się, że clear_canvas należy tam. Użyj testów, aby poprowadzić projekt, krok po kroku.

+0

Dziękuję. Twoja odpowiedź była bardzo pomocna. Podążając za twoim przykładem, jeśli usunę wszystkie globalne odniesienia, w jaki sposób przetestujesz metodę taką jak clearRect lub drawImage, która zajmuje się rysowaniem na płótnie? drwi? – John

+0

Tak, mocks dla twoich obiektów w izolacji, ale więcej stylu integracji sprawdza obiekty, które mają do czynienia z obiektami zewnętrznymi. Są to tylko testy, które wykonują zewnętrzny obiekt i sprawdzają jego stan pod kątem zamierzonego zachowania podczas testu. –

3

Jordão ma absolutną rację, ale jest też brzydka.
Dołącz swój obiekt globalny do okna przed każdym sposobem. Kod poniżej prawdopodobnie nie działa (nie testowałem go), ale powinien być wystarczająco dobry, aby zrozumieć, jak obejść ten problem z jaśminowym obiektem globalnym.

(function() { 
    describe('Canvas Actions', function() { 
    beforeEach(function() { 
     window.Canvas_Actions = (function() { 
function Canvas_Actions() {} 
Canvas_Actions.prototype.clear_canvas = function() { 
    moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height); 
    main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height); 
    return window.canvas_objects = []; 
}; 
return Canvas_Actions; 
})(); 
    }); 
return describe('clear_canvas', function() { 

    return it('clears the canvases and deletes all objects', function() { 
    var actions; 
    jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures"; 
    loadFixtures("canvas_fixture.html"); 
    actions = window.Canvas_Actions; 
    actions.clear_canvas(); 
    return expect(canvas_objects).toEqual([]); 
    }); 
}); 
    }); 
}).call(this); 
Powiązane problemy