2016-06-29 1 views
0

J'ai le test ROR RSpec suivant:Comprendre ActiveRecord :: Relations avec RSpec exemple

Gardez à l'esprit que le test ne passe tout comme dans le code ci-dessous. La méthode est correctement définie et fait ce qui est prévu. La question est pourquoi quand je modifie et enlève le [] autour du @public_topic dans le deuxième exemple le test échoue?

describe "scopes" do 
    before do 
     @public_topic = Topic.create!(name: RandomData.random_sentence, description: RandomData.random_paragraph) 
     @private_topic = Topic.create!(name: RandomData.random_sentence, description: RandomData.random_paragraph, public: false) 
    end 

    describe "visible_to(user)" do 
     it "returns all topics if user is present" do 
      user = User.new 
      expect(Topic.visible_to(user)).to eq(Topic.all) 
     end 
     it "returns only public topics if user is nil" do 
     expect(Topic.visible_to(nil)).to eq([@public_topic]) 
     end 
    end 
    end 

mise à jour

scope :visible_to, -> { where(public: true) } 
+0

Quelle est votre méthode 'visible_to' censé revenir. A partir de votre test, il semble qu'il soit supposé retourner un tableau avec quelque chose dedans. Par conséquent, lorsque vous supprimez le '[]', renvoyant un objet, il échoue. –

Répondre

1

Il est difficile de dire sans voir la mise en œuvre de visible_to.

Dans le premier exemple, il semble que cette méthode renvoie un objet ActiveRecord::Relation. Cela va représenter une collection d'objets et pas un seul objet.

Donc, en substance, il se résume à:

object != [object] 
+0

Même si c'est un seul objet à l'intérieur de la collection, il ne compte pas comme un seul objet? – davefogo

+1

Non. Pensez-y comme ceci: Un garage de stationnement avec une seule voiture à l'intérieur n'est pas équivalent à une seule voiture. – Jonathan

+0

Grande analogie! merci pour cela – davefogo