Использование RSpec для контроллеров iPhone - PullRequest
3 голосов
/ 10 ноября 2008

Я наконец-то освоил RSpec, проведя пару часов в выходные. Теперь я застрял, пытаясь понять, как утверждать, что параметры действительно передаются в контроллер. Я следую примеру в шутку от Ruby / Cocoa и адаптирую его для iPhone SDK. Я сделал более подробную запись моего прогресса в моем блоге , поэтому я отложу всю статью до конца. Короче говоря, я прошел весь урок до того момента, когда вам нужно передать значение пина из текстового поля в объект Bowling. RSpec продолжает жаловаться на то, что "Spec :: Mocks :: MockExpectationError в X OSX :: BowlingController должен отправлять значение вывода объекту боулинга Ожидается макет "Боулинг": бросьте с (10), но получили с (без аргументов) ./test/bowling_controller_spec.rb:38:veloper Даже если я уверен, что передаю значение. Вот мой код. Может кто-нибудь сказать мне, где я иду не так?

bowling_controller_spec.rb

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

require "BowlingController.bundle"
OSX::ns_import :BowlingController

include OSX

describe BowlingController do
  before(:each) do
    @controller = BowlingController.new  
    @bowling = mock('Bowling')
    @text_field = mock('Pins')
    @text_field.stub!(:intValue).and_return(10)
    @controller.pins = @text_field
  end

  it "should roll a ball" do
    @controller.roll
  end

  it "should roll a ball and get the value from the pins outlet" do
    @text_field.should_receive(:intValue).and_return(0)
    @controller.roll
  end

  it "should be an OSX::NSObject" do
    @controller.is_a?(OSX::NSObject).should == true
  end

  it "should have an outlet to a bowling object" do
    @controller.bowling = @bowling
  end

  it "should send the pin value to the bowling object" do
    @controller.bowling = @bowling
    @bowling.should_receive(:roll).with(10)

    @controller.roll
  end
end

BowlingController.h

#import <Foundation/Foundation.h>

@class UITextField;
@class Bowling;

@interface BowlingController : NSObject {
    UITextField* pins;
    Bowling* bowling;
}
@property (nonatomic, retain) UITextField* pins;
@property (nonatomic, retain) Bowling* bowling;

-(void) roll;
@end

BowlingController.m

#import "BowlingController.h"
#import "Bowling.h"


@implementation BowlingController
@synthesize pins;
@synthesize bowling;

-(void) roll{
    [self.bowling roll:[self.pins intValue]];
}

@end

// This initialization function gets called when we import the Ruby module.
// It doesn't need to do anything because the RubyCocoa bridge will do
// all the initialization work.
// The rbiphonetest test framework automatically generates bundles for 
// each objective-c class containing the following line. These
// can be used by your tests.
void Init_BowlingController() { }

Bowling.h

#import <Foundation/Foundation.h>

@interface Bowling : NSObject {

}
- (void) roll:(int) pins;
@end

Bowling.m

#import "Bowling.h"


@implementation Bowling
- (void) roll:(int) pins{
}

@end

// This initialization function gets called when we import the Ruby module.
// It doesn't need to do anything because the RubyCocoa bridge will do
// all the initialization work.
// The rbiphonetest test framework automatically generates bundles for 
// each objective-c class containing the following line. These
// can be used by your tests.
void Init_Bowling() { }

Ответы [ 2 ]

3 голосов
/ 11 ноября 2008

RubyCocoa вообще не поддерживается на iPhone. Библиотеки поддержки мостов нет, и я не верю, что на телефоне есть какой-либо интерпретатор ruby.

Возможно, вы сможете заставить его работать в симуляторе, это не помешает вам использовать только библиотеки OS X, если вы действительно попробуете, но это все равно не заставит его работать на iPhone.

Если вы действительно хотите использовать RubyCocoa на iPhone, вам нужно собрать ruby ​​в качестве статической библиотеки и перенести мост на телефон, что выполнимо, но, вероятно, будет очень сложно.

0 голосов
/ 12 ноября 2008

Хауди! Хотя я не знаком с тем, как Ruby / Cocoa переносит вызовы внешних методов - или, если уж на то пошло, с Objective C - первое место, которое может отключиться при тестировании, - это передача Ruby-макета на встроенный контроллер. В учебном пособии по боулингу прокси контроллера ruby ​​представляет свой интерфейс с мостом Какао, в то время как в этой реализации прокси оборачивает открытый интерфейс Какао. В этом случае может возникнуть проблема при замене макета рубина на собственное поле вместо макета рубина на поле рубина.

Тест roll () для выводов проходит успешно, поэтому возможно, что сообщения передаются правильно, но аргументы искажены или отброшены.

Это, вероятно, не очень помогает, но это интересная проблема. Удачи в проекте!

...