Ruby on rails RSpec期望值从(…)。到(…)返回错误

Ruby on rails RSpec期望值从(…)。到(…)返回错误,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我有以下代码: 它“绘制颜色C的一个h段”do editor.send:创建_图像,3,2 pp编辑器.image 期待{ pp editor.image#=>[[“O”,“O”,“O”],[“O”,“O”,“O”]] editor.send:draw_水平,0,1,0,'C' pp editor.image#=>[[“C”、“C”、“O”]、[“O”、“O”、“O”]] }.改变{ 编辑图像 }. from([“O”,“O”,“O”],[“O”,“O”,“O”]])。 致[“C”、“C”、“O

我有以下代码:

它“绘制颜色C的一个h段”do
editor.send:创建_图像,3,2
pp编辑器.image
期待{
pp editor.image#=>[[“O”,“O”,“O”],[“O”,“O”,“O”]]
editor.send:draw_水平,0,1,0,'C'
pp editor.image#=>[[“C”、“C”、“O”]、[“O”、“O”、“O”]]
}.改变{
编辑图像
}.
from([“O”,“O”,“O”],[“O”,“O”,“O”]])。
致[“C”、“C”、“O”]、[“O”、“O”、“O”]]
结束
因为调用方法
:draw_horizontal
前后的两行代码都将
中的内容从
返回给
匹配器,所以我希望测试能够通过

事实上,我发现了这个错误:

我还试图从
中删除
,只将
保留到
,但这样做的结果是


有没有办法解决这个问题?谢谢

这是瞎猜,但是试试这个

describe 'isolate this block to use `subject`' do # You'll have to name this accordingly
  subject { editor }
  before { editor.send :create_image, 3, 2 }
  it 'draws one h-segment of colour C' do
    expect { editor.send :draw_horizontal, 0, 1, 0, 'C' }.
    to change(:image).
    from([["O", "O", "O"], ["O", "O", "O"]]). 
    to   [["C", "C", "O"], ["O", "O", "O"]]
  end
end

我尝试了@benjamin sinclaire建议的解决方案,但不幸的是没有成功

为了解决这个问题,我必须评估
数组的
.To
,而不是它本身的值。 我不知道这是否是在比较通过引用而不是通过值传递的变量
@image
的内容

it 'draws one h-segment of colour C' do
  expect {
    editor.send(:draw_horizontal, 0, 1, 0, 'C')
  }.to change { editor.image.to_s }.
  from([["O", "O", "O"], ["O", "O", "O"]].to_s).
  to   [["C", "C", "O"], ["O", "O", "O"]].to_s

end

这样做效果很好,但如果您找到了另一个(更好的)解决方案和解释,请在下面进行评论。

干得好。更干净的方法是使用
检查
。它在数组上给出了相同的结果,但是使用
inspect
是一个好习惯,因为它可以处理Ruby中的几乎所有内容。
describe 'isolate this block to use `subject`' do # You'll have to name this accordingly
  subject { editor }
  before { editor.send :create_image, 3, 2 }
  it 'draws one h-segment of colour C' do
    expect { editor.send :draw_horizontal, 0, 1, 0, 'C' }.
    to change(:image).
    from([["O", "O", "O"], ["O", "O", "O"]]). 
    to   [["C", "C", "O"], ["O", "O", "O"]]
  end
end
it 'draws one h-segment of colour C' do
  expect {
    editor.send(:draw_horizontal, 0, 1, 0, 'C')
  }.to change { editor.image.to_s }.
  from([["O", "O", "O"], ["O", "O", "O"]].to_s).
  to   [["C", "C", "O"], ["O", "O", "O"]].to_s

end