2011-11-18 15 views
6

Benim testler aşağıdaki nedenle başarısız:Başka bir sınıf/dosyadan global değişken içeren bir yöntem için nasıl bir yasemin testi yazarım?

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

Ben testi başarısız nedenini anlıyoruz. Bu, ayrı bir javascript dosyasında tanımlandığı için değişkeni anlamıyor. Ancak, küresel olarak ilan edilir ve gerçekte çalışır.

Bu clear_canvas işlevi için bir yasemin testini nasıl yazarım?

JavaScript Canvas_actions: Canvas_actions için

(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); 

Yasemin Testi:

(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); 

cevap

8

it is declared globally and works in reality

Eh, o da zaman test seferlerine ilan edilmesi gerekiyor. Yani muhtemelen test fikstür html'de tanımlandığı senaryo için bir referans eksik. Ayrıca, küresel değişkenler normalde iyi bir fikir değildir, zor hatalar oluşturma eğilimindedirler. Jasmine'ı bir test çerçevesi olarak kullandığınızdan bu yana, testinizdeki kodunuza ilettiğiniz bir şeydeki küresel değişkenin bağımlılığını soyutlamaya çalışın. Daha sonra, test etmek için yasemin alaycı yeteneklerini kullanın. Eğer Canvas_Actions global başvuruları kaldırırsanız

, bu gibi görünebilir:

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(); 
}; 

Sen yasemin ve izolasyon testi Canvas_Actions ile canvas argüman alay edebilir.

olarak bu kod bir Canvas sınıfUnearth ve clear_canvas orada ait olduğunu öğrenmek olabilir belki, kaydedilmemiştir. Tasarımınızı yönlendirmek için testleri kullanın, her seferinde bir adım.

+0

Teşekkür ederiz. Cevabınız çok yardımcı oldu. Örneğinizin ardından, tüm global referansları kaldırırsam, tuvalde çizim yapmakla ilgilenen clearRect veya drawImage gibi bir yöntemi nasıl test edersiniz? alay? – John

+0

Evet, nesneleriniz için ayrılmış, ancak daha fazla tümleştirme stili, dış nesnelerle ilgilenen nesneleri denetler. Bunlar sadece harici bir nesneyi kullanan ve test edilen amaçlanan davranış için durumunu kontrol eden testlerdir. –

3

Jordão kesinlikle haklıdır, ancak çirkin bir seçenek de vardır.
Genel nesneyi beforeEach yöntemindeki pencereye ekleyin. Aşağıdaki kod muhtemelen işe yaramıyor (test etmediniz), ancak bu yasemin global nesne probleminin etrafında nasıl çalışılacağını anlamak için yeterince iyi olmalı.

(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);