2017-10-17 21 views
1

Je veux compiler quelques ERB dans un fichier CSV dans un appareil pour mes spécifications. Voici le CSV:Comment compiler ERB dans un appareil CSV avec rspec/Rails 5?

(spécifications/fixtures/fichiers/song_info.csv.erb)

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

Dans mon test, je crée d'abord une chanson que je peux interpoler est id dans l'appareil, puis charge le CSV. Ce qui se passe à l'intérieur du test est sans importance.

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 

Le problème est que lorsque je vérifie le contenu de csv, je vois que c'est juste une chaîne avec l'ERB brut (non compilé).

à savoir "song_id, new_song_title, <%= song.id %>, Song Title"

Comment forcer le ERB compiler? Est-ce que #read n'est pas la bonne méthode file_fixture? Est-ce autre chose complètement?

Remarque: Je sais qu'il existe d'autres façons d'effectuer cela sans appareils, mais ceci est un exemple trivial. Je veux juste savoir comment compiler ERB dans un appareil.

Répondre

1

Vous devez créer une instance ERB et évaluer:

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

binding est un peu magique, il vous donnera une instance de Binding classe qui encapsule le contexte d'exécution à cet endroit particulier dans le code. Plus d'infos: https://ruby-doc.org/core-2.3.0/Binding.html

Si vous avez besoin de liaison sur mesure pour effectuer des opérations plus complexes, vous pouvez créer une classe et générer un liant à partir de là, par exemple:

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)