Ruby 如何使用RSpec测试带有参数的方法?
我有以下RSpec:Ruby 如何使用RSpec测试带有参数的方法?,ruby,rspec3,Ruby,Rspec3,我有以下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)
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
方法:
Class Job
def run_job(my_param)
# puts "#{my_param}"
my_param.each do|f|
# do something
end
end
end
当我运行测试时,我收到以下错误
NoMethodError:
undefined method `each' for nil:NilClass
我在控制台中打印出
my_param
,看到传递给测试的同一个对象,[{“job1”=>“run”},{“job2”=>“run reach”}]
。我不知道为什么调用时,我的参数为nil
。每个。我做错了什么?任何见解都值得赞赏 一种方法是在before块中定义实例变量并将其形成为
before { @my_param = [{"job1" => "run"}, {"job2" => "run again"}] }
或
但最好的方法是使用let:
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
一种方法是在before块中定义实例变量并将其形成为
before { @my_param = [{"job1" => "run"}, {"job2" => "run again"}] }
或
但最好的方法是使用let:
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
my_param
应该在it
块中定义,或者您应该使用let
来定义my_param
内部it块
使用let
使用前块
my_param
应该在it
块中定义,或者您应该使用let
来定义my_param
内部it块
使用let
使用前块
建议使用let
分配变量:
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
建议使用let
分配变量:
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
在方法内部定义my_param
没有任何意义,因为传递给方法的参数将不起作用,定义的变量将是静态的,而不是动态的。此处my_param仅使用一次。因此,我认为它可以这样使用。在方法内部定义my_参数
没有任何意义,因为传递给方法的参数将不起作用,而定义的变量将是静态
,而不是动态
。在这里,my_参数只使用一次。所以我认为它可以这样使用。我可以使用let
调用job.run\u job(my\u param)
在上下文下吗?如果是,语法是什么?是@cicici在我的回答中使用let
部分检查。我可以使用let
调用job。在上下文下运行作业(my\u参数)
?如果是,语法会是什么?是@CiCi在我的回答中使用let
部分检查。“我不知道为什么我的_参数为nil”-在示例外部定义的局部变量在示例中不可用。就像在方法外部定义的局部变量在方法内部不可用一样,“我不知道为什么我的参数为nil”——在示例外部定义的局部变量在示例内部不可用。就像在方法外部定义的局部变量在方法内部不可用一样。