2008-10-12 1 views
16

나는 아이폰 SDK를 실험하고 TDD ala Dr. Nic의 rbiPhoneTest 프로젝트를하고있다. 나는 iPhone/Cocoa 용 테스트 프레임 워크를 사용하여 얼마나 많은 사람들이 성공했는지 궁금합니다. 더 중요한 것은 독점적 인 바이너리 요청/응답 프로토콜을 가장 효과적으로 어서 트하는 방법을 알고 싶습니다. 아이디어는 네트워크를 통해 바이너리 요청을 보내고 바이너리 응답을 수신하는 것입니다. 요청 및 응답은 byte and'ing 및 or'ing을 사용하여 작성됩니다. 내 요청을 테스트하는 데 황금색 사본 패턴을 사용하고 있습니다. 여기 내가 지금까지 가지고있는 것이있다. 내가 객관적 C와 루비를 btoh에 새로 온 사람으로 웃지 마십시오 :아이폰 네이티브 애플 리케이션을위한 테스트 주도 디자인

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 

답변

11

루비 또는 이진 프로토콜에 대해 잘 모르겠지만, 당신은 아이폰에 단위 테스트에 관심이 있다면, 당신은 할 수 있습니다 Google Toolbox for Mac을 확인하십시오. OpenGL ES 응용 프로그램을 성공적으로 테스트하면서 큰 성공을 거두고 있습니다.

+0

나는 이것이 내 정적 클래스를 테스트하는 데 정말 잘 작동한다는 것에 동의한다. http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting –

6

클리프, 오랫동안 당신은 ObjC TDD 툴에 오랫동안 투자하는 것이 가장 좋습니다. 필자는 fmdb-migration-manager에서 자신의 rbiphonetest lib를 성공적으로 사용했지만 라이브러리의 유용성은 아마도 라이브러리에만 국한 될 것입니다. 그렇다면 틀림없이 '코코아에서 작동하지만 UIKit에서는 실패합니다'라는 시나리오가 유용 할 것입니다. 바라건대 언젠가 RubyCocoa가 Intel UIKit 라이브러리를 기반으로 구축 될 수 있기를 기대하며 매우 유용하고 견고 할 것입니다.