2008-10-12 10 views
16

Estoy experimentando con el iPhone SDK y haciendo un proyecto TDD ala Dr. Nic rbiPhoneTest. Me pregunto cuántos, si alguno, han tenido éxito utilizando este u otro marco de prueba para iPhone/Cocoa. Más importante, me gustaría saber cómo hacer valer mejor un protocolo de solicitud/respuesta binario patentado. La idea es enviar una solicitud binaria a través de la red y recibir una respuesta binaria. Las solicitudes y las respuestas se crean utilizando byte and'ing y or'ing. Estoy usando el patrón de copia dorada para probar mi solicitud. Esto es lo que tengo hasta ahora. No se ría como yo soy nuevo en btoh Objective C y Ruby:Test Driven Design para aplicaciones nativas de iPhone

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 

Respuesta

11

no sé mucho sobre Ruby o protocolos binarios, pero si usted está interesado en la unidad de pruebas en el iPhone, puede que desee para ver el Google Toolbox for Mac. Estoy teniendo un gran éxito probando mi aplicación OpenGL ES con ella.

+0

Estoy de acuerdo, esto me ha funcionado muy bien al probar mis clases estáticas. http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting –

6

Acantilado, a largo plazo, lo mejor es invertir tiempo en herramientas ObjC TDD puras. He usado mi propia rbiphonetest lib en fmdb-migration-manager con éxito, pero su utilidad probablemente esté limitada a las bibliotecas, etc. Incluso entonces habrá, sin duda, suficientes 'trabajos en Cocoa pero fallarán en los escenarios de UIKit' para hacer que rbiphonetest sea dudoso. Afortunadamente, un día, RubyCocoa se puede construir contra las bibliotecas Intel UIKit y creo que será muy útil y robusto.

Cuestiones relacionadas