2 votes

Est-il légal de bloquer la méthode #class d'un objet Mock lors de l'utilisation de RSpec dans une application Ruby on Rails ?

J'aimerais bloquer la méthode #class d'un objet fantaisie :

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

A la ligne 5 de ce programme, je bloque la méthode #class, afin de permettre des choses comme @john.class.name. Est-ce que c'est la bonne façon de faire ? Est-ce qu'il y aura des effets secondaires néfastes ?

Editer :

La classe Letter se présente comme suit :

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

Je me demande si ActiveRecord obtient le nom de la classe du champ :to à l'aide de la fonction to.class.name ou par d'autres moyens. C'est peut-être à cela que sert la méthode class_name d'ActiveRecord::Base ?

3voto

BiHi Points 928

Je pense que vous devriez utiliser mock_model pour ce cas particulier. Votre before(:each) ressemblerait à cela :

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

Ensuite, pour votre autre question, vous ne devriez pas vraiment vous soucier de la façon dont Rails fonctionne pour tester votre comportement. Je ne pense pas que ce soit une bonne idée de tester vous-même les champs to_type et to_id. Il s'agit du comportement de Rails et, en tant que tel, il devrait être testé dans Rails, pas dans votre projet.

J'ai utilisé Remarquable depuis un certain temps et cela rend les choses très faciles à spécifier :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X