Ho sviluppato in RoR da più di un anno, ma sto solo iniziando a utilizzare i test, usando RSpec.Come strutturare le mie cartelle di test, file e database RSpec?
Per i test modello/controller standard, di solito non ho alcun problema, ma il problema è che voglio testare alcuni complicati processi funzionali e non so come strutturare le mie cartelle/file/database di test .
Ecco una struttura di base per la mia domanda:
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
Il problema principale è che voglio simulare il ciclo di vita del mio oggetto, il che significa:
Instantiating clienti e portafogli che sarà essere utilizzato per tutti i test (senza reinizializzazione)
Simulazione del flusso di tempo, creazione e aggiornamento di più ordini/oggetti fattura e alcuni i nvoice_summaries.
Per la creazione e l'aggiornamento degli ordini/fatture/invoice_summaries, mi piacerebbe avere metodi come
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
ho già trovato la gemma Timecop per simulare il flusso del tempo. Quindi, mi piacerebbe avere un test finale facile da capire che assomiglia a
# 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
Qualcuno ha già tali test? Ci sono buone pratiche per strutturare le fabbriche di oggetti, scrivere test e così via?
Ad esempio, mi è stato detto che una buona idea sarebbe quella di mettere la creazione Cliente/Portafoglio in un file db/seed.rb, ma in realtà non so cosa farmene dopo.
@HunterStevens Credo che la tua modifica sia errata, perché hai rimosso qualche logica sugli ordini. 'def create_order_n; end' È diverso da 'def create_order_1; end' 'def create_order_2; end' dal momento che @vincent voleva esprimere la necessità di fare 2 cose completamente diverse. Dovresti fare attenzione prima di modificare in questo modo ... – Erowlin
@Erowlin, per favore, ripristina la mia modifica. Stavo cercando di ripulire un post molto lungo. Scusate. – onebree
NP, fai solo attenzione la prossima volta;). A proposito, grazie per la tua modifica, è partita da una buona intenzione! – Erowlin