Tôi đã phát triển trong RoR hơn một năm nay, nhưng tôi mới bắt đầu sử dụng các bài kiểm tra, sử dụng RSpec.Làm cách nào để cấu trúc thư mục, tệp và cơ sở dữ liệu kiểm tra RSpec của tôi?
Đối với thử nghiệm mô hình/bộ điều khiển chuẩn, tôi thường không gặp vấn đề gì, nhưng vấn đề là tôi muốn thử nghiệm một số quy trình chức năng phức tạp và không biết cách cấu trúc thư mục/tệp/cơ sở dữ liệu thử nghiệm của mình .
Dưới đây là một cấu trúc cơ bản cho ứng dụng của tôi:
class Customer
has_one :wallet
has_many :orders
has_many :invoices, through: :orders
has_many :invoice_summaries
end
class Wallet
belongs_to :customer
end
class Order
has_one :invoice
belongs_to :customer
end
class Invoice
belongs_to :order
belongs_to :invoice_summary
end
class InvoiceSummary
belongs_to :customer
has_many :invoices
end
Vấn đề chính là tôi muốn để mô phỏng vòng đời của đối tượng của tôi, có nghĩa là:
Instantiating khách hàng và ví đó sẽ được sử dụng cho tất cả các thử nghiệm (không cần khởi tạo lại)
Mô phỏng luồng thời gian, tạo và cập nhật nhiều đơn đặt hàng/đối tượng hóa đơn và một số i nvoice_summaries.
Đối với việc tạo ra và cập nhật các đơn đặt hàng/hóa đơn/invoice_summaries, tôi muốn có phương pháp như
def create_order_1
# code specific to create my first order, return the created order
end
def create_order_2
# code specific to create my second order, return the created order
end
.
.
.
def create_order_n
# code specific to create my n-th order, return the created order
end
def bill_order(order_to_bill)
# generic code to do the billing of the order passed as parameter
end
def cancel_order(order_to_cancel)
# generic code to cancel the order passed as parameter
end
Tôi đã tìm thấy viên ngọc Timecop cho mô phỏng dòng chảy thời gian. Do đó, tôi muốn có một bài kiểm tra cuối cùng dễ hiểu giống như
# Code for the initialization of customers and wallets object
describe "Wallet should be equal to 0 after first day" do
Timecop.freeze(Time.new(2015,7,1))
first_request = create_request_1
first_request.customer.wallet.value.should? == 0
end
describe "Wallet should be equal to -30 after second day" do
Timecop.freeze(Time.new(2015,7,2))
bill_order(first_request)
second_order = create_order_2
first_request.customer.wallet.value.should? == -30
end
describe "Wallet should be equal to -20 after third day" do
Timecop.freeze(Time.new(2015,7,3))
bill_order(second_request)
cancel_order(first_request)
first_request.customer.wallet.value.should? == -20
end
describe "Three first day invoice_summary should have 3 invoices" do
Timecop.freeze(Time.new(2015,7,4))
invoice_summary = InvoiceSummary.create(
begin_date: Date.new(2015,7,1),
end_date: Date.new(2015, 7,3)
) # real InvoiceSummary method
invoice_summary.invoices.count.should? == 3
end
Có ai đã có các bài kiểm tra như vậy không? Có thực hành tốt cho cấu trúc của các nhà máy đối tượng, kiểm tra văn bản và như vậy?
Ví dụ, tôi đã được cho biết rằng một ý tưởng hay là đặt công cụ tạo khách hàng/Wallet trong tệp db/seed.rb, nhưng tôi thực sự không biết phải làm gì với nó sau đó.
@HunterStevens Tôi tin rằng chỉnh sửa của bạn sai, bởi vì bạn đã xóa một số logic về các đơn đặt hàng. 'def create_order_n; end' IS khác với 'def create_order_1; end' 'def create_order_2; end' vì @vincent muốn thể hiện sự cần thiết phải làm 2 điều hoàn toàn khác biệt. Bạn nên cẩn thận trước khi chỉnh sửa như thế này ... – Erowlin
@Erowlin vui lòng quay lại bản chỉnh sửa của tôi sau đó. Tôi đã cố gắng để làm sạch một bài rất dài. Lấy làm tiếc. – onebree
NP, hãy cẩn thận lần sau;). BTW, cảm ơn bạn đã chỉnh sửa, nó bắt đầu từ một ý định tốt! – Erowlin