2017-10-17 1 views
1

Ich möchte einige ERB in eine CSV in einem Gerät für meine Spezifikation kompilieren. Hier ist die CSV:Wie kompiliere ich ERB in einer CSV-Fixture mit rspec/Rails 5?

(spez/Einrichtung/files/song_info.csv.erb)

song id,  song_title 
<%= song.id %>, Fun Title 

In meinem Test habe ich erstellen Sie zuerst ein Lied, so kann ich interpolieren es id in die Halterung, dann laden die CSV.

describe "#update" do 
    let(:song) { FactoryGirl.create :song }   # create the instance 
    let(:csv) { file_fixture("song_info.csv.erb").read } # load the file 

    it "finds a song and adds it's title" do   
    # when I look at csv here, it is just a string with the raw ERB 
    end 
end 

Was innerhalb des Tests passiert, ist unwichtig. Das Problem ist, dass, wenn ich den Inhalt von csv auschecke ich sehe, dass es nur eine Zeichenfolge mit dem rohen ERB (unkompiliert) ist.

heißt "song_id, new_song_title, <%= song.id %>, Song Title"

Wie kann ich die ERB zwingen zu kompilieren? Ist #read nicht die richtige file_fixture Methode? Ist es etwas völlig anderes?

Hinweis: Ich weiß, dass es andere Möglichkeiten gibt, dies ohne Fixtures zu erreichen, aber das ist ein triviales Beispiel. Ich möchte nur wissen, wie man ERB zu einem Gerät zusammenfügt.

Antwort

1

Sie benötigen eine ERB-Instanz erstellen und auswerten:

let(:csv) { ERB.new(file_fixture("song_info.csv.erb").read).result(binding) } # load the file 

binding ein bisschen magisch ist, wird es eine Instanz von Binding Klasse geben, die den Ausführungskontext an dieser bestimmten Stelle im Code kapselt. Weitere Informationen: https://ruby-doc.org/core-2.3.0/Binding.html

Wenn Sie benutzerdefinierte Bindung komplexere Operationen zu tun, Sie eine Klasse erstellen können und erzeugen dort eine Bindung, zB:

require 'csv' 
require 'erb' 

class CustomBinding 
    def initialize(first_name, last_name) 
    @id = rand(1000) 
    @first_name = first_name 
    @last_name = last_name 
    end 

    def get_binding 
    binding() 
    end 
end 

template = <<-EOS 
"id","first","last" 
<%= CSV.generate_line([@id, @first_name, @last_name]) %> 
EOS 

puts ERB.new(template).result(CustomBinding.new("Yuki", "Matz").get_binding)