2016-11-29 4 views
1

Ich bin neu zu testen und mit einigen der Konzepte zu kämpfen. Ich verstehe die Idee ist, die Dinge in der Isolation durch Mocks und Stubs zu testen, jedoch mit den folgenden habe Schwierigkeiten:RSpec - Zugriff auf Array-Methoden

class Circle 
    has_many :jobs 

    def accepted 
    jobs.where('sitter_id > 0') 
    end 
end 

class Job 
    belongs_to :circle 
end 

Und mein RSpec:

require 'rails_helper' 

RSpec.describe Circle, type: :model, focus: true do 

    let (:circle_1) { FactoryGirl.create(:circle, title: 'London', 
               location: 'London', 
               administrator_id: 1) } 

    let (:job_1) { FactoryGirl.create(:job, start_time: "2016-11-14 20:00:00", 
              end_time: "2016-11-14 23:00:00", 
              tokens_offered: 6, 
              requester_id: 1, 
              circle_id: 1, 
              sitter_id: 5, 
              actual_start_time: "2016-11-14 20:00:00", 
              actual_end_time: "2016-11-14 23:30:00", 
              tokens_paid: 7) } 

    before do 
    circle_1.stub(:jobs).and_return([job_1]) 
    end 

    describe 'instance methods' do 
    context 'accepted' do 
     it 'should return jobs with a sitter' do 
     expect(circle_1.accepted).to include(job_1) 
     end 
    end 
    end 
end 

Daraus ergibt sich:

NoMethodError: 
    undefined method `where' for #<Array:0x007feb4ae72858> 

Würde ich dann das Verhalten der Where-Methode auf dem Array stub? Was mich verwirrt, ist sicherlich, dass ich genau das teste, was ich teste, und indem ich es stubbe, sage ich dem Test, was der Code tut, anstatt den Code selbst zu testen.

Wenn jemand erklären könnte, wenn ich das falsch verstehe, und wie ich den Test entweder neu schreiben oder durchgehen lassen kann, würde ich es sehr schätzen.

+0

'circle_id: circle_1.id' - und keine Notwendigkeit, die' Jobs' zu stubben –

+0

Der Job wird zurückgegeben, wenn Circle_1.jobs aufgerufen wird, es ist nur RSpec nicht wissen, wo auf dem Array von wo what ' ich kann – Mark

+0

sehen, weil Sie es als Array Stummel, tun, was ich vorgeschlagen;) –

Antwort

0

Das Problem ist, dass Sie AR-Sammlung auf ein Array-Objekt, die natürlich keine where-Methode hat.

Sie möchten die Zuordnung auf der Werksebene herstellen. Sie können es erreichen mit

circle_id: circle_1.id # in job_1 

diese Having Sie wird die Sammlung von Arbeitsplätzen müssen und Ihr Test wird wie erwartet nicht Stummel.

+0

stubbed ich das Array da die Assoziationen nicht gesetzt wurden - wie du jedoch erklärst, dass ein anderes Objekt von circle.jobs zurückgegeben wird. Jetzt, da die IDs richtig eingestellt sind, geht alles vorüber - danke für die Hilfe. – Mark

+0

@Mark stellen Sie sicher, die Antwort (Häkchen in der Nähe der Antwort Punktzahl) zu akzeptieren, wenn das Problem gelöst wurde. –