Mam dwie klasy:Szybkie testy (Rspec) z i bez szyn
1. Sprzedaż jest podklasą ActiveRecord; jego zadaniem jest utrzymywanie danych dotyczących sprzedaży w bazie danych.
class Sale < ActiveRecord::Base
def self.total_for_duration(start_date, end_date)
self.count(conditions: {date: start_date..end_date})
end
#...
end
2.SalesReport jest standardową klasą Ruby; jego zadaniem jest tworzenie i tworzenie wykresów informacji o sprzedaży.
class SalesReport
def initialize(start_date, end_date)
@start_date = start_date
@end_date = end_date
end
def sales_in_duration
Sale.total_for_duration(@start_date, @end_date)
end
#...
end
Bo chcę użyć TDD i chcę moje próby uruchomienia bardzo szybko, napisałem spec SalesReport że nie nie załadować szyn:
require_relative "../../app/models/sales_report.rb"
class Sale; end
# NOTE I have had to re-define Sale because I don't want to
# require `sale.rb` because it would then require ActiveRecord.
describe SalesReport do
describe "sales_in_duration" do
it "calls Sale.total_for_duration" do
Sale.should_receive(:total_for_duration)
SalesReport.new.sales_in_duration
end
end
end
ten test działa po uruchomieniu bundle exec rspec spec/models/report_spec.rb
.
Jednak ten test kończy się niepowodzeniem po uruchomieniu bundle exec rake spec
z błędem superclass mismatch for class Sale (TypeError)
. Wiem, że błąd występuje, ponieważ Tap jest zdefiniowany przez sale.rb
i wbudowany w specyfikację.
Więc moje pytanie jest sposobem na Stub (lub makiety lub Double) klasy, jeśli ta klasa nie jest zdefiniowana? Pozwoliłoby mi to usunąć wbudowany class Sale; end
, który wydaje się być hack.
Jeśli nie, w jaki sposób skonfigurować testy tak, aby działały poprawnie, niezależnie od tego, czy uruchamiam bundle exec rspec
czy bundle exec rake spec
?
Jeśli nie, czy moje podejście do pisania szybkich testów jest złe ?!
Wreszcie, nie chcę używać Sporka. Dzięki!
Dzięki Myron Marston! – Mike