【发布时间】:2015-08-10 13:46:17
【问题描述】:
我已经在 RoR 开发一年多了,但我才刚刚开始使用测试,使用 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
主要问题是我想模拟我的对象的生命周期,意思是:
实例化将用于所有测试的客户和钱包(无需重新初始化)
模拟时间流,创建和更新多个订单/发票对象和一些 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
我已经找到了用于模拟时间流的 gem 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与def create_order_1; enddef create_order_2;end不同,因为 @vincent 想要表达做两件完全不同的事情的需要。在这样编辑之前你应该小心...... -
@Erowlin 请回滚我的编辑。我试图清理一个很长的帖子。对不起。
-
NP,下次小心点;)。顺便说一句,感谢您的编辑,这是出于好意!
标签: ruby-on-rails ruby rspec rspec-rails functional-testing