Tôi có hai lớp:Kiểm tra nhanh (Rspec) có và không có Rails
1.Sale là phân lớp của ActiveRecord; công việc của nó là duy trì dữ liệu bán hàng cho cơ sở dữ liệu.
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 là lớp Ruby chuẩn; công việc của nó là tạo và biểu thị thông tin về Bán hàng.
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
Bởi vì tôi muốn sử dụng TDD và tôi muốn thử nghiệm của tôi để chạy rất nhanh, tôi đã viết một spec cho SalesReport mà không không tải Rails:
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
này kiểm tra hoạt động khi tôi chạy bundle exec rspec spec/models/report_spec.rb
.
Tuy nhiên, kiểm tra này không thành công khi tôi chạy bundle exec rake spec
với lỗi superclass mismatch for class Sale (TypeError)
. Tôi biết lỗi xảy ra vì Tap được xác định bởi sale.rb
và nội dòng trong thông số kỹ thuật.
Vì vậy, câu hỏi của tôi là có cách để Stub (hoặc Mock hoặc Double) một lớp nếu lớp đó không được xác định? Điều này sẽ cho phép tôi xóa nội tuyến class Sale; end
, cảm giác như bị hack.
Nếu không, làm cách nào để thiết lập các thử nghiệm của mình sao cho chúng chạy chính xác cho dù tôi chạy bundle exec rspec
hoặc bundle exec rake spec
?
Nếu không, cách tiếp cận của tôi để viết kiểm tra nhanh có sai không ?!
Cuối cùng, tôi không muốn sử dụng Spork. Cảm ơn!
Cảm ơn Myron Marston! – Mike