Ruby on rails 带rspec的模拟arr.map(&;:to_)

Ruby on rails 带rspec的模拟arr.map(&;:to_),ruby-on-rails,ruby,unit-testing,rspec,Ruby On Rails,Ruby,Unit Testing,Rspec,使用#map(&:to_s)调用考虑以下代码: arr = [1,2,3] arr.map(&:to_s) 你可以这样嘲弄它 expect(arr).to receive(:map) { |arg| expect(arg).to receive(:to_s) }.and_return(["some","values"]) # spec/rails_helper.rb Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| r

使用
#map(&:to_s)
调用考虑以下代码:

arr = [1,2,3]
arr.map(&:to_s)
你可以这样嘲弄它

expect(arr).to receive(:map) { |arg|
  expect(arg).to receive(:to_s)
}.and_return(["some","values"])
# spec/rails_helper.rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
RSpec.configure do |config|
  include MockHelper
end

# spec/support/mock_helper.rb
module MockHelper
  def mock_map(array)
    expect(array).to receive(:map).and_return(['some', 'values'])
    array.map(&:to_s)
  end
end

# spec/some_folder/some_spec.rb
describe SomeSpec do
  it 'receives map(&:to_s)' do
    mock_map [1, 2, 3]
  end
end
但这不是很方便,我在代码中经常使用快捷方式。

在RSpec中模拟
map(&:to_s)
调用是否有一个方便的快捷方式(或者是否可以创建一个?)


我不建议在这个级别进行模拟,但如果你真的想这样做,你可以按照你的要求创建一个快捷方式

expect(arr).to receive(:map) { |arg|
  expect(arg).to receive(:to_s)
}.and_return(["some","values"])
# spec/rails_helper.rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
RSpec.configure do |config|
  include MockHelper
end

# spec/support/mock_helper.rb
module MockHelper
  def mock_map(array)
    expect(array).to receive(:map).and_return(['some', 'values'])
    array.map(&:to_s)
  end
end

# spec/some_folder/some_spec.rb
describe SomeSpec do
  it 'receives map(&:to_s)' do
    mock_map [1, 2, 3]
  end
end
不过,我想这会更好

it 'converts array to String Array' do
  expect([1, 2, 3].map(&:to_s)).to eq ['1', '2', '3']
end

您是否可以编辑您的问题,以包含实际代码的示例,这些代码的测试包括类似于上面的内容?看起来你在以比你应该的低得多的水平嘲弄事物。