Frage

Ich frage mich, wie man die Einheimischen validiert

Regler:

def lelf_panel
  # ...
  if some_condition
    locals_hash = some_very_long_hash_A
  else
    locals_hash = some_very_long_hash_B
  end
  render :partial => "left_panel", :layout => false, :locals => locals_hash
end

Aktuelle Spezifikation:

it 'should render correct template for lelf_panel' do
  # ... 
  get 'left_panel'
  response.should render_template('system/_left_panel')
end   

Jetzt muss ich RCOV für diesen Controller beenden, damit ich die Spezifikation hinzufügen/ändern muss, um beide Ergebnisse von "slow_condition" abzudecken. Und ich möchte die an das Rendern übergebenen "lelf_panel" -Dookale validieren, als ob ich nur die render_template validieren würde, die teilweise Seite für beide Ergebnisse sind gleich.

Ich überprüfe die 'render_template' in RSPEC -Dokumenten inhttp://rubydoc.info/gems/rspec-ils/2.8.1/rspec/rails/Matchers/rendertemplate:render_template

Es bietet nur 2nd Params für die Nachricht. Wie kann ich also die Einheimischen testen, die an das Rendern übergeben wurden?

War es hilfreich?

Lösung

Soweit ich weiß, gibt es keine Möglichkeit, die Einheimischen direkt auf eine Vorlage zu untersuchen, wie Sie beschreiben.

Sie können locals_hash in @Locals_hash ändern und dann die Ergebnisse durch Zuweisungen (: locals_hash) untersuchen.

Sie können auch Selektoren für das resultierende HTML verwenden und überprüfen, ob ein indikativer Inhalt vorhanden ist. Wenn Sie beispielsweise den Titel der Seite beeinflussen, überprüfen Sie, ob Sie erwarten, dass der resultierende HTML -Seitentitel das ist, was Sie erwarten.

Andere Tipps

Anstatt die zu verwenden render_template Durch Match können Sie eine Erwartung am Controller -Objekt verwenden.

it 'should render correct template for lefl_panel' do
  # ...
  allow(controller).to receive(:render).with no_args
  expect(controller).to receive(:render).with({
    :partial => 'system/_left_panel',
    :layout  => false,
    :locals  => some_very_long_hash_A
  })
  get 'left_panel'
end

Wie @Ryan -Aahearns Antwort mit Vorschlägen des Kommentars von @user2490003 - aber alle in etwas Flexibleres und für RSPEC 3 gesetzt.

  # Safe to set globally, since actions can either render or redirect once or fail anyway
  before do
    allow(controller).to receive(:render).and_call_original
  end

  describe "get left panel" do
    before do
      # other setup
      get 'left_panel'
    end

    it 'should render correct template for lelf_panel' do
      # Sadly, render_template is primitive (no hash_including, no block with args, etc.)
      expect(subject).to render_template('system/_left_panel')
    end

    it 'should render with correct local value' do
      expect(controller).to have_received(:render) do |options|
        expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash')
      end
    end
  end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top