Использование RSpec для контроллеров iPhone

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

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

Боулинг. М

#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() { }
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
3
0
875
2

Ответы 2

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

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

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

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

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

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

Другие вопросы по теме