Rspec存根从给定块返回值

时间:2015-02-18 13:37:28

标签: ruby-on-rails ruby rspec

我正试图在Rspec中处理存根问题。我想了解如何从数组中返回值。

这是我此刻想要存根的内容,

if client.jobs.any?
      client.jobs.map do |job|
        if job.job_locations.any?
            job.job_locations.map do |jl| 
                if jl.location_id == self.location_id
                    errors.add(:location_id, "This location is in use with another of the client's jobs")
                    return false
                end
            end
        end
      end
    end

我可以存根第一行(客户端有作业),但我不知道如何存根数组的返回值,以便它们在规范测试中运行。

这是相关的代码段

        context "location_id matches job_location location_id" do 
          before do
            allow(client_location).to receive(:client).and_return(client)
            allow(client).to receive(:jobs).and_return(some_jobs) 
            allow(some_jobs).to receive(:map).and_return([job]) 
            #eventually I want to get to this
            allow_any_instance_of(JobLocation).to receive(:location_id).and_return(1)
            allow_any_instance_of(ClientLocation).to receive(:location_id).and_return(1)
          end
          it "returns false" do 
            expect(@instance.destroy).to be_falsey
          end
        end

我应该在spec测试中添加'some_jobs'变量是工厂女孩生成的实例。有些工作等于[some_jobs]。

1 个答案:

答案 0 :(得分:0)

如果您将some_jobs定义为[job](例如通过RSpec的let机制),则无需重新定义地图,您的生产代码将继续执行。通过删除some_jobs.map,您基本上绕过了生产代码的其余部分。

另外,client_locationclientsome_jobsjob的定义都与您共享的代码段高度相关,应该包含在内。

相关问题