2017-03-25 2 views
0

Ich habe diesen einfachen CodeRSpec warum ist vorher (: jeder) nie ausgeführt?

require 'json' 

module Html 
    class JsonHelper 
    attr_accessor :path 

    def initialize(path) 
     @path = path 
    end 

    def add(data) 
     old = JSON.parse(File.read(path)) 
     merged = old.merge(data) 
     File.write(path, merged.to_json) 
    end 
    end 
end 

und diese Spezifikation (so viel reduziert, wie konnte ich während der Arbeit noch)

require 'html/helpers/json_helper' 

describe Html::JsonHelper do 
    let(:path) { "/test/data.json" } 
    subject { described_class.new(path) } 

    describe "#add(data)" do 
    before(:each) do 
     allow(File).to receive(:write).with(path, anything) do |path, data| 
     @saved_string = data 
     @saved_json = JSON.parse(data) 
     end 

     subject.add(new_data) 
    end 

    let(:new_data) { { oldestIndex: 100 } } 
    let(:old_data) { {"test" => 'testing', "old" => 50} } 

    def stub_old_json 
     allow(File).to receive(:read).with(path).and_return(@data_before.to_json) 
    end 

    context "when given data is not present" do 
     before(:each) do 
     puts "HERE" 
     binding.pry 
     @data_before = old_data 
     stub_old_json 
     end 

     it "adds data" do 
     expect(@saved_json).to include("oldestIndex" => 100) 
     end 

     it "doesn't change old data" do 
     expect(@saved_json).to include(old_data) 
     end 
    end 
    end 
end 

HERE nie gedruckt wird und binding.pry Ausführung und Tests nicht stoppen fehlgeschlagen mit Meldung No such file or directory @ rb_sysopen - /test/data.json

Das alles bedeutet, dass vorher (: each) nie ausgeführt wird.

Warum?
Wie es zu beheben?

+0

Funktioniert die Verwendung eines relativen Pfades? './test/data.json' –

Antwort

1

Die gewünschte Nachricht wird nicht gedruckt, da sie beim ersten before Block fehlschlägt. Rspec doc about execution order

Es schlägt fehl, weil Sie einen absoluten Pfad zur Verfügung gestellt, so dass er prüft /test/data.json

Entweder relativen Pfad zum Test dh verwenden. ../data.json (nur Raten), oder vollständigen Pfad. Bei Schienen: Rails.root.join('path_to_folder_with_data_json', 'data.json')

Verwandte Themen