La spécification suivante fonctionne mais je sais que cela ne devrait pas être comme ça. J'ai du mal à faire tourner ma tête autour de rspec, en particulier les mocks et les stubs.Comment dois-je spécifier ce
C'est le code du modèle
class RecipeFermentable < ActiveRecord::Base
belongs_to :recipe
belongs_to :product
def set_attributes()
attrs = product.product_attributes
self.ppg = attrs.find_by_name(:ppg.to_s).value
self.ecb = attrs.find_by_name(:ecb.to_s).value
end
end
Et c'est la spécification que j'ai écrit
it "should set the attributes from the product" do
@product_attribute1 = mock_model(ProductAttribute, :name => :ppg, :value => 40)
@product_attribute2 = mock_model(ProductAttribute, :name => :ecb, :value => 1)
@product = Product.new
@product.product_attributes << @product_attribute1
@product.product_attributes << @product_attribute2
@recipe_fermentable = RecipeFermentable.new
@recipe_fermentable.product.should_receive(:product_attributes).and_return(@product_attributes)
@product_attributes.stub(:find_by_name).with(:ppg.to_s).and_return(@product_attribute1)
@product_attributes.stub(:find_by_name).with(:ecb.to_s).and_return(@product_attribute2)
@recipe_fermentable.set_attributes
@recipe_fermentable.ppg.should eql(40)
@recipe_fermentable.ecb.should eql(1)
end
Pour commencer mon spec est beaucoup plus grande que ma méthode, et je me sers un vrai produit . Quelques conseils sur la façon d'écrire une bonne spécification pour cela serait vraiment utile. Aussi, si quelqu'un connaît une bonne ressource pour apprendre rspec en utilisant des mock et des stubs, s'il vous plaît pourriez-vous ajouter des liens.
Merci
Merci, cela fait beaucoup de sens. La raison pour laquelle je duplique des données est due au fait que les attributs du produit peuvent changer avec le temps mais que les attributs de la recette doivent rester les mêmes. Sauf si l'utilisateur veut les changer. – Damian
Super. Absolument logique de stocker les attributs de la façon dont vous l'avez fait alors ... – hgmnz