2017-12-09 2 views
0

Ich habe folgendes RSpec:Wie testet man eine Methode mit einem Parameter mit RSpec?

describe Job do 
    let(:job) { Job.new } 

    describe 'run_job' do 
    context 'success' do 
     my_param = [{"job1" => "run"}, {"job2" => "run again"}] 

     it 'should pass' do 
      test_result = job.run_job(my_param) 
      expect(test_result[0]["job1"]).to eq("run") 
     end 
    end 
    end 
end 

Die Methode:

Class Job 
    def run_job(my_param) 
    # puts "#{my_param}" 
    my_param.each do|f| 
     # do something 
    end 
    end 
end 

, wenn ich den Test ausführen ich die folgende Fehlermeldung

NoMethodError: 
    undefined method `each' for nil:NilClass 

ich drucken my_param in der Konsole und Siehe dasselbe Objekt, das an den Test übergeben wurde, [{"job1" => "run"}, {"job2" => "run again"}]. Ich habe keine Ahnung, warum my_param ist nil beim Aufruf .each. Was habe ich falsch gemacht? Jeder Einblick wird geschätzt.

+1

_ "Ich habe keine Ahnung warum my_param ist null" _ - außerhalb des Beispiels definierte lokale Variablen sind im Beispiel nicht verfügbar. Genauso wie eine lokale Variable, die außerhalb einer Methode definiert wurde, nicht innerhalb der Methode verfügbar ist. – Stefan

Antwort

1

my_param sollte innerhalb des it Block definiert werden, oder sollten Sie let verwenden definieren my_param

Darin Block

describe Job do 
    let(:job) { Job.new } 

    describe 'run_job' do 
    context 'success' do   
     it 'should pass' do 
      my_param = [{"job1" => "run"}, {"job2" => "run again"}] 

      test_result = job.run_job(my_param) 
      expect(test_result[0]["job1"]).to eq("run") 
     end 
    end 
    end 
end 

Mit

describe Job do 
    let(:job) { Job.new } 

    describe 'run_job' do 
    context 'success' do 
     let(:my_param) { [{"job1" => "run"}, {"job2" => "run again"}] } 


     it 'should pass' do 
      test_result = job.run_job(my_param) 
      expect(test_result[0]["job1"]).to eq("run") 
     end 
    end 
    end 
end 

Verwendung vor Block

describe Job do 
    let(:job) { Job.new } 

    describe 'run_job' do 
    context 'success' do 
     before(:all) do 
      @my_param = [{"job1" => "run"}, {"job2" => "run again"}] 
     end 

     it 'should pass' do 
      test_result = job.run_job(@my_param) 
      expect(test_result[0]["job1"]).to eq("run") 
     end 
    end 
    end 
end 
+0

Kann ich 'let' verwenden, um' job.run_job (my_param) 'direkt im Kontext aufzurufen? Wenn ja, wie wäre die Syntax? – CiCi

+0

Ja @CiCi Überprüfen Sie den Abschnitt "Verwendung" in meiner Antwort. –

0

Eine Möglichkeit wäre, im Vorher-Block zu definieren und die Instanzvariable als;

before { @my_param = [{"job1" => "run"}, {"job2" => "run again"}] } 

oder

aber der beste Weg wäre, lassen Sie zu verwenden:

describe Job do 
    let(:job) { Job.new } 
    let(:my_param) { [{"job1" => "run"}, {"job2" => "run again"}] } 
    describe 'run_job' do 
    context 'success' do 

     it 'should pass' do 
     test_result = job.run_job(my_param) 
     expect(test_result[0]["job1"]).to eq("run") 
     end 
    end 
    end 
end 
+1

Es macht keinen Sinn, 'my_param' innerhalb der Methode zu definieren, da Parameter, die an Methode und definierte Variable übergeben werden, nicht" static "statt" dynamic "sind. –

+0

Hier war my_param nur einmal zu verwenden. so kann es meiner Meinung nach so verwendet werden. –

Verwandte Themen