2008-10-12 17 views
16

iPhone SDK ile deneme yapıyorum ve bazı TDD ala Dr. Nic'in rbiPhoneTest projesini yapıyor. IPhone/Kakao için bu ya da başka bir test çerçevesini kullanarak başarılı olup olmadığını merak ediyorum. Daha da önemlisi, özel bir ikili istek/yanıt protokolünün nasıl en iyi şekilde kullanılacağını bilmek isterim. Fikir, ağ üzerinden ikili bir istek göndermek ve ikili bir yanıt almaktır. İstekler ve yanıtlar bayt ve 've/veya' kullanarak oluşturulur. İsteğimi test etmek için altın kopya desenini kullanıyorum. Şimdiye kadar sahip olduğum şeyler. Ben Objective C ve Ruby btoh yeniyim olarak Gülmeyin:iPhone Yerel uygulamaları için Test Driven Tasarımı

require File.dirname(__FILE__) + '/test_helper' 
require 'fileutils' 
require 'io' 

require "MyModel.bundle" 
OSX::ns_import :MyModel 

module MyTestExtensions 
    def is_absolute_path(path) 
    return /^\/.*/.match(path) 
    end 

    def parent_directory(file) 
    dir = file 
    if(! is_absolute_path(dir)) 
     dir = File.expand_path(dir) 
    end 
    dir = File.dirname(dir) 
    assert is_absolute_path(dir), "Expecting an absolute path with #{dir}" 
    return dir 
    end 

    def assert_NSData_contains_bytes_from_file(file, data) 
    assert_not_nil data, "Data should not be nil." 
    assert data.bytes, "data should have bytes" 
    data.length.times { |i| 
     expected = file.getc 
     assert_not_nil expected, "Expected only #{i} bytes. Actual data contains more." 
     actual = data.bytes.int8_at(i) 
     assert_equal expected, actual, "Bytes should be equal at offset #{i} expected #{expected.chr} but was #{actual.chr}" 
    } 
    expected = file.getc 
    raise AssertionFailedError, "Expecting #{expected.chr} at offset #{data.length}" unless expected == nil 
    end 

end 

class TestMyModel < Test::Unit::TestCase 
include OSX 
include MyTestExtensions 

    def this_files_dir 
    return parent_directory(__FILE__) 
    end 

    def setup 
    @expectedReq = File.new("#{this_files_dir}/ExpectedMyReq") 
    # @expectedReq = File.new("#{this_files_dir}/hello.txt") 
    assert File.exist?("#{this_files_dir}/ExpectedMyReq"), "The file [#{@expectedReq.path}] should exist." 
    end 

    def test_my_model_class_exists 
    MyModel 
    end 

    def test_can_init_instance 
    assert MyModel.instancesRespondToSelector(:init), "MyModel Should define :init" 
    end 

    def test_my_model_can_request_my_data 
    myModel = MyModel.alloc.init 
    data = myModel.requestMyData 'Some query text' 
    assert_NSData_contains_bytes_from_file @expectedReq, data 
    end 

end 

cevap

11

Ben Ruby veya ikili protokoller hakkında çok şey bilmiyorum, ama sen iPhone'da birim test ilgileniyorsanız, sen isteyebilirsiniz Google Toolbox for Mac’u kontrol etmek için OpenGL ES uygulamamı onunla test ederken çok başarılıyım.

+0

Katılıyorum, bu benim statik sınıflarımı test etmek için gerçekten iyi çalıştı. http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting –

6

Uçurum, uzun vadede saf ObjC TDD araçlarında en iyi yatırım süresine sahip olursunuz. Fmdb-migrasyon yöneticisinde kendi rbiphonetest lib'imi başarılı bir şekilde kullandım, ancak kullanışlılığı muhtemelen kütüphaneler vb. Ile sınırlıdır. O zaman bile, hiç kuşkusuz, “UIKit'te senaryolarda başarısızlığa yol açacak kadar '' kakaoda '' ama '' başarısız '' olacaktır. Umarım bir gün RubyCocoa Intel UIKit kütüphanelerine karşı inşa edilebilir ve bence çok faydalı ve sağlam olacaktır.