Допустимо ли заглушать метод #class объекта Mock при использовании RSpec в приложении Ruby on Rails? - PullRequest
2 голосов
/ 19 апреля 2009

Я бы хотел заглушить метод #class для фиктивного объекта:

describe Letter do
  before(:each) do
    @john = mock("John")
    @john.stub!(:id).and_return(5)
    @john.stub!(:class).and_return(Person)  # is this ok?
    @john.stub!(:name).and_return("John F.")
    Person.stub!(:find).and_return(@john)
  end
  it.should "have a valid #to field" do
    letter = Letter.create!(:to=>@john, :content => "Hello John")
    letter.to_type.should == @john.class.name
    letter.to_id.should == @john.id
  end
  [...]
end

В строке 5 этой программы я заглушаю метод #class, чтобы разрешить такие вещи, как @ john.class.name. Это правильный путь? Будет ли какой-нибудь плохой побочный эффект?

Edit:

Класс Letter выглядит следующим образом:

class Letter < ActiveRecord::Base
    belongs_to :to, :polymorphic => true
    [...]
end

Интересно, получает ли ActiveRecord имя класса: to в поле с to.class.name или каким-либо другим способом. Может быть, для этого и используется метод class_name ActiveRecord :: Base?

1 Ответ

3 голосов
/ 25 апреля 2009

Я думаю, вы должны использовать mock_model для этого конкретного случая. Ваш before(:each) будет выглядеть так:

before(:each) do
  @john = mock_model(Person, :name => "John F.")
  Person.stub!(:find).and_return(@john)
end

Тогда для вашего другого вопроса, вам не нужно беспокоиться о том, как работает Rails для проверки вашего поведения. Я не думаю, что это хорошая идея, чтобы проверить поля to_type и to_id самостоятельно. Это поведение Rails, поэтому его следует тестировать в Rails, а не в вашем проекте.

Я уже некоторое время использую Замечательно , и это очень легко определить:

describe Letter
  should_belong_to :to, :polymorphic => true
end
...