2009-08-22 6 views
0

J'essaie de simuler un objet qui est passé dans un autre objet, et je n'ai pas de succès. Quelqu'un peut-il me montrer ce que je fais mal?rspec maquette question

class Fetcher 
    def download 
    return 3 
    end 
end 

class Reports 
    def initialize(fetcher) 
    @fetcher = fetcher 
    end 
    def status 
    @fetcher.download 
    end 
end 


describe Reports do 
    before(:each) do 
    end 

    it "should get get status of 6" do 
    Fetcher.should_receive(:download).and_return(6) 
    f = Reports.new(Fetcher.new) 
    f.status.should == 6 
    end 
end 

La spécification indique encore le statut de retour 3, pas mon DESTINÉ 6.

Certainement je manque quelque chose ici. Des pensées?

Répondre

1

Dans le test, ce que je pense que vous essayez de faire est ce (je pense)

it '...' do 
    some_fetcher = Fetcher.new 
    some_fetcher.should_receive(:download).and_return(6) 

    f = Reports.new(some_fetcher) 
    f.status.should == 6 
end 

quand vous dites Fetcher.should_receive (: téléchargement), vous dites que la classe doit recevoir le appel 'télécharger', au lieu de INSTANCES de la classe ...

Espérons que cela aide! Si ce n'est pas clair, faites le moi savoir!

+0

Merci, c'était tout. TOUTEFOIS .... deux choses. 1. Pourquoi les instances de Fetcher n'héritent-elles pas des modifications de la classe? Si j'ajoutais une nouvelle méthode à Fetcher, puis l'instanciait, il aurait cette méthode, n'est-ce pas? 2. Je suis arrivé au code ci-dessus à partir d'un screencast Peepcode sur rspec. Le code original était pour un modèle Rails, et ressemblait à ceci: def mock_feed (code postal, how_many = 1) xml = ... Weather.should_receive (: open) .exactement (combien) .times. avec ("http://weather.yahooapis.com/forecastrss?p=#{zipcode}"). and_return (xml) fin Pourquoi sa modification de classe fonctionne-t-elle, et non la mienne? –

+0

Pour le # 1, vous pouvez le faire, mais les problèmes surviennent facilement là où vous n'êtes pas sûr d'avoir la seconde classe instanciée au bon moment. Au lieu de définir de nouvelles méthodes comme vous l'avez décrit, vous pouvez essayer d'utiliser 'instance_eval'. Donc, si vous vouliez ajouter une méthode à Fletcher, vous pouvez faire: Fletcher.class_eval ne def some_method ... fin fin D'autres gars expliquent mieux que je peux. Voici quelques liens: http://bmorearty.wordpress.com/2009/01/09/fun-with-rubys-instance_eval-and-class_eval/ # 2, je ne pouvais pas vraiment faire de problème. Pourriez-vous réessayer? – btelles

0

Une mise à jour basée sur la nouvelle syntaxe.

subject(:reports) { described_class.new(fetcher) } 
let(:fetcher}  { double("Fetcher") } 

describe "#status" do 
    it "gets status of 6" do 
    fetcher.stub(download: 6) 
    expect(reports.status).to == 6 
    end 
end