Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用RSpec测试带有参数的方法?_Ruby_Rspec3 - Fatal编程技术网

Ruby 如何使用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)

我有以下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
方法:

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”——在示例外部定义的局部变量在示例内部不可用。就像在方法外部定义的局部变量在方法内部不可用一样。