Rails model specs passing, Sidekiq spec fehlgeschlagen - ruby-on-rails, rspec, sidekiq

Ich baue eine Rails (4.1.0) App, die eine Umfrage ausführt n Matchups mit n Sitze. Hier sind meine Modelle:

class Matchup < ActiveRecord::Base
has_many :seats, dependent: :destroy

def winning_seat
seats.sort { |a,b| a.number_of_votes <=> b.number_of_votes }.last
end
end

class Seat < ActiveRecord::Base
belongs_to :matchup

validates :matchup, presence: true
validates :number_of_votes, presence: true

def declare_as_winner
self.is_winner = true
self.save
end

end

Meine Spezifikationen für Matchup und Seat Pass ohne Problem.Am Ende einer Umfrage muss ich den Gewinner anzeigen. Ich verwende einen Sidekiq-Mitarbeiter, um das Ende der Umfrage zu bewältigen. Es macht viele Dinge, aber hier ist der Code in Frage:

class EndOfPollWorker
include Sidekiq::Worker

def perform(poll_id)
poll = Poll.where(:id poll_id)
poll.matchups.each do |matchup|
# grab the winning seat
winning_seat = matchup.winning_seat
# declare it as a winner
winning_seat.declare_as_winner
end
end
end

Die Spezifikation für diesen Arbeiter besteht nicht:

require "rails_helper"

describe "EndOfPollWorker" do
before do
#this simple creates a matchup for each poll question and seat for every entry in the matchup
@poll = Poll.build_poll
end

context "when the poll ends" do
before do
@winners = @poll.matchups.map { |matchup| matchup.seats.first }
@losers = @poll.matchups.map { |matchup| matchup.seats.last }
@winners.each do |seat|
seat.number_of_votes = 1
end

@poll.save!

@job = EndOfPollWorker.new
end

it "it updates the winner of each matchup" do
@job.perform(@poll.id)
@winners.each do |seat|
expect(seat.is_winner?).to be(true)
end
end

it "it does not update the loser of each matchup" do
@job.perform(@poll.id)
@losers.each do |seat|
expect(seat.is_winner?).to be(false)
end
end

end

end
end
end

Wenn ich diese Spezifikation ausführe, bekomme ich:

EndOfPollWorker when poll ends it updates the winner of each matchup
Failure/Error: expect(seat.is_winner?).to be(true)

expected true
got false

Meine Spezifikationen für die Seat und Matchup Modelle passen gut. Ich habe einen großen Teil des Testcodes aussortiert, also entschuldigen Sie nicht übereinstimmende Tags, gehen Sie davon aus, dass "nicht das Problem ist!

Wenn die Worker tatsächlich im Entwicklungsmodus ausgeführt werden, wird das Attribut "sites.is_winner" tatsächlich nicht aktualisiert.

Vielen Dank

Antworten:

0 für die Antwort № 1

Sidekiq hat nichts mit Ihrem Problem zu tun.Sie rufen direkt perform auf, so dass das Problem bei rspec und activerecord liegt. Ziehen Sie beispielsweise den Code aus der perform-Methode und fügen Sie ihn direkt in die Spezifikation ein, er sollte dennoch fehlschlagen.

Ich vermute, dass die Instanzen veraltet sind und von der Datenbank neu geladen werden müssen, um die in #perform vorgenommenen Änderungen zu übernehmen.


Verwandte Fragen
Speisekarte