Dalla mia comprensione, il valore restituito dal metodo "to_create" di una factory viene ignorato. Ciò significa che l'oggetto restituito dalla parte 'build' o 'initialize_with' della factory è l'oggetto restituito alla fine quando si chiama 'create' all'interno di un test.FactoryGirl to_create valore restituito
Nel mio caso, sto usando una variante del modello di deposito. Sto sovrascrivendo la parte 'to_create' della factory per includere una chiamata al metodo 'save' del repository. Questo metodo non modifica l'oggetto dato, ma restituisce un oggetto che rappresenta la forma persistente dell'originale.
Tuttavia, l'istanza restituita dal blocco 'build' viene restituita dalla fabbrica e non l'istanza creata nel blocco 'to_create'. Nel mio codice, questo significa che viene restituita la forma "non protetta" dell'oggetto, non l'oggetto con attributi aggiornati (ad esempio "id") dall'azione di salvataggio.
Esiste un modo per forzare il valore restituito di 'create' come risultato del blocco 'to_create' o di qualche valore generato all'interno di quel blocco?
class Foo
attr_accessor :id, :name
...
end
class FooRepository
def self.create(name)
Foo.new(name) # this object is not yet persisted and has no .id
end
def self.save(foo)
# this method must not guarantee that the original Foo instance
# will always be returned
...
updated_foo # this is a duplicate of the original object
end
...
end
FactoryGirl.define do
factory :foo, class: FooRepository do
# create an example Foo
initialize_with { FooRepository.create(name: "Example") }
# save the Foo to the datastore, returning what may be a duplicate
to_create {|instance| FooRepository.save(instance)}
end
end
describe FooRepository do
it "saves the given Foo to the datastore" do
foo = create(:foo)
foo.id #=> nil
...
end
end
Nice! Ha aiutato con qualche problema diverso, ma comunque una bella risposta! :) – Aleks