2012-08-16 22 views
5

ile test ederken yenilenmeye devam ediyor Aşağıdaki Jasmine sınamasını (1) çalıştırarak, sınama başarıyla gerçekleştirilir, ancak ana sınama sayfasının yinelemeli yüklemesiyle karşılaşıyorum.Tarayıcı sayfası, omurga görünümlerini Jasmine

Herhangi bir fikir: Burada

benim test (1) ve burada hangi ben testi (2) çalıştırıyorum modülüdür? Sorunu nasıl düzeltebilirim?

S.S .:
Sorun sadece Chrome ve Safari Tarayıcısı ile ilgilidir.
Bir örnek: jsfiddle.net/shioyama/EXvZY


(1)

describe('When Submit button handler fired', function() { 
    beforeEach(function() { 
     spyOn(MyView.prototype, 'submitForm'); 
     this.view = new MyView(); 
     this.view.render(); 
     this.view.$el.find('form').submit(); 
    }); 

    it('submitForm should be called', function() { 
     expect(MyView.prototype.submitForm).toHaveBeenCalled(); 
    }); 
}); 

(2)

var MyView = Backbone.View.extend({ 
    events: { 
     'submit form' : 'submitForm' 
    }, 

    submitForm: function (event) { 
     event.preventDefault(); 
     // some code 
    } 
}); 
+0

Bunun için burada bir jsfiddle oluşturduk: http://jsfiddle.net/shioyama/EXvZY/8/. Test geçiyor ve ben tekrarlayan bir yükleme göremiyorum, ama belki de tam olarak ne aradığımı bilmiyorum. Ne demek istediğini açıklayabilir misin? –

+0

Üzgünüz, bu link: http://jsfiddle.net/shioyama/EXvZY/ –

+0

@shioyama, jsfiddle'u yarattığınız için teşekkür ederim. Ne demek istediğimi anladın mı? –

cevap

3

Omurga temsilci olaylar kullanır Görünüm oluşturulduğunda bağlı olan. View.el dosyanız oluşturulduğunda form içermiyor, bunun yerine render yönteminde bir tane oluşturuyorsunuz. Bu nedenle, gönderilen temsilci etkinliği sınırlanmaz ve bunun yerine sayfadaki formu gönderirsiniz. Bu form gönderimi, Jasmine paketinin tekrar çalıştırılmasını tetikleyen aynı URL'ye gider ve sonuçta bir döngü oluşturur.

Eğer kod biraz değiştirirseniz

, bu sürüm görüntüleme oluşturulmaz önce <formu> eleman var oldukça çalıştığını göreceksiniz.

var MyView = Backbone.View.extend({ 
    events: { 
     'submit form' : 'submitForm' 
    }, 

    submitForm: function (event) { 
     event.preventDefault(); 
     // some code 
    } 
}); 

//start test runner right after we're done defining our tests in this script 
window.setTimeout(function(){ 
    jasmine.getEnv().addReporter(new jasmine.TrivialReporter()); 
    jasmine.getEnv().execute(); 
}, 0); 

//TESTS GO HERE 
describe('When Submit button handler fired', function() { 
    beforeEach(function() { 
     spyOn(MyView.prototype, 'submitForm').andCallThrough(); 
     this.view = new MyView({ 
      el: $('<div><form><input type="submit" value="Submit" /></form></div>') 
     }); 
     this.view.$el.find('form').submit(); 
    }); 

    it('submitForm should be called', function() { 
     expect(MyView.prototype.submitForm).toHaveBeenCalled(); 
    }); 
});​ 

+0

Cevabınız için teşekkürler. açıklamanız çok açık. Her neyse, "this.view" i, "render" i çağırmadan yaratırsam, "this.view." $ El.find ('form') testini gerçekleştirdiğimde "MyView.prototype.submitForm" çağrılmaz. veya 'this.view. $ el.submit();'. Herhangi bir fikir? –

+0

İşte işe yaramayan önerinizi http://jsfiddle.net/EXvZY/19/ kullanarak jsfidlle. Bir şey özlediysem beni düzeltin! –

+0

İki şey: # 1: Temsilci seçme olayları bir seçiciyi kullanır, böylece kök düğümüne bağlı olmazlar - Bir kapsayıcı olarak bir div ekledim & # 2: Bir casus eklersiniz, ancak çağrının yayılmasına izin vermezsiniz Gönderilen işleyicinin hiçbir zaman false döndürmeyeceği anlamına gelen casus öğeye kadar - .andCallThrough() eklemesi gerekir. –