Я развиваюсь в RoR уже более года, но я только начинаю использовать тесты, используя RSpec.Как структурировать мои тестовые папки RSpec, файлы и базу данных?
Для стандартных тестов модели/контроллера у меня обычно нет никаких проблем, но проблема в том, что я хочу протестировать некоторые сложные функциональные процессы и не знаю, как структурировать мои тестовые папки/файлы/базу данных ,
Вот базовая структура для моего приложения:
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
Основная проблема заключается в том, что я хочу, чтобы имитировать жизненный цикл моего объекта, а это означает:
Инстанцирование клиентов и кошельки, которые будут (без повторной инициализации)
Моделирование потока времени, создание и обновление нескольких объектов заказов/счетов и некоторых nvoice_summaries.
Для создания и обновления этих заказов/счетов/invoice_summaries, я хотел бы иметь методы, как
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
Я уже нашел драгоценный камень Timecop для моделирования течения времени. Следовательно, я хотел бы иметь простой для понимания окончательный тест, который выглядит как
# 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
У любого уже есть такие тесты? Существуют ли хорошие методы структурирования объектных заводов, написания тестов и т. Д.?
Например, мне сказали, что хорошей идеей было бы создать заказчик/кошелек в файле db/seed.rb, но я действительно не знаю, что с ним делать после этого.
@HunterStevens Я считаю, что ваше изменение неверно, потому что вы удалили некоторую логику о заказах. 'def create_order_n; end' IS отличается от 'def create_order_1; end' 'def create_order_2; end', так как @vincent хотел выразить необходимость сделать 2 полностью разных вещи. Вы должны быть осторожны перед редактированием, как это ... – Erowlin
@ Erowlin, пожалуйста, откатите мое редактирование. Я пытался убрать очень длинный пост. Сожалею. – onebree
NP, просто будьте осторожны в следующий раз;). Кстати, спасибо за ваше редактирование, это началось с хорошего намерения! – Erowlin