2008-09-12 23 views

cevap

11

bir entegrasyon testinde biçimini ve assert_select kullanarak bir arada harika çalışıyor: Daha fazla ayrıntı için

class ProductsTest < ActionController::IntegrationTest 
    def test_contents_of_xml 
    get '/index/1.xml' 
    assert_select 'product name', /widget/ 
    end 
end 

Raylar docs assert_select göz atın.

0

Seti isteği nesneleri başlık kabul bir kontrolör.

class ProductsControllerTest < ActionController::TestCase 
    def test_should_get_index_formatted_for_xml 
    @request.env['HTTP_ACCEPT'] = 'application/xml' 
    get :index 
    assert_response :success 
    end 
end 
+0

bildiğim bu kısmı, bir A..Z entegrasyon testi –

+1

O assert_equal arayan da çok kırılgan. Öğe veya özellik sırasının garantisi yoktur; eğer değişirse, testiniz bozulur. XML ağaçlarının eşitliğini kontrol etmek için doğru dize karşılaştırması doğru yol değildir. – bjnord

5

ne bekliyorsanız eşittir:

+0

Bu zaten sahip olduğum işlevsel bir test. Entegrasyon testi yapmak. –

1

Bu 2 yanıt mükemmeldir, ancak sonuçların çoğu durumda farklı olmak için gong olan datetime alanlarını içermesi nedeniyle assert_equal başarısız olur. Görünüşe göre, bir XML ayrıştırıcısı kullanarak @response.body içeriklerini işlemek ve sonra tek tek alanları, elemanların sayısını vs. karşılaştırmak gerekecek. Veya daha kolay bir yol var mı?

+0

Evet; tarih ve saat alanları, assert_equal'ın XML ağaçlarını karşılaştırmanın yanlış yolu olmasının bir başka nedenidir. Kendim için, bütün nesnemi testlerimde eşitlik için karşılaştırmamıştım; Kontrol etmek istediğim özellikler için assert_select (yukarıda gösterilen ntalbott gibi) kullandım. – bjnord

5

Ntalbott'un yanıtı bir harekete geçme eylemi gösterir. Hareket sonrası eylem biraz daha zorlayıcı; Yeni nesneyi bir XML mesajı olarak göndermek ve XML niteliklerinin denetleyicideki params karma değerinde gösterilmesini istiyorsanız, üstbilgileri doğru şekilde almanız gerekir. İşte bir örnek (Raylar 2.3.x) var:

class TruckTest < ActionController::IntegrationTest 
    def test_new_truck 
    paint_color = 'blue' 
    fuzzy_dice_count = 2 
    truck = Truck.new({:paint_color => paint_color, :fuzzy_dice_count => fuzzy_dice_count}) 
    @headers ||= {} 
    @headers['HTTP_ACCEPT'] = @headers['CONTENT_TYPE'] = 'application/xml' 
    post '/trucks.xml', truck.to_xml, @headers 
    #puts @response.body 
    assert_select 'truck>paint_color', paint_color 
    assert_select 'truck>fuzzy_dice_count', fuzzy_dice_count.to_s 
    end 
end 

İleti göndermek için 2 bağımsız değişkeni bir parametre karma olmak zorunda olmadığını burada görebilirsiniz; başlıkları doğruysa, bir dize (XML içeren), olabilir. 3. argüman, @headers, anlamaya çok fazla araştırma yapan bölüm.

(ayrıca Not to_s kullanımının assert_select bir tamsayı değeri ile karşılaştırılması.)

İlgili konular