在RSpec测试中调用Model方法时的NoMethodError

时间:2016-02-11 19:12:48

标签: ruby rspec tdd

我正在编写一个脚本来自动对计算机上的文件进行排序,比如截图。我在Mac上。因此,每当我拍摄截图时,它都会在我的桌面上创建。脚本的一部分用途是不时清理桌面。

我见过的大多数Ruby脚本都是无类别的(har har),但是我决定将我的课程归类,所以我可以使用RSpec和TDD来测试一切,然后练习我的RGR循环。

在名为'Mover'的类中对名为'chdir'的方法运行RSpec测试时,我收到此错误:

Failures:

  1) Mover#chdir changes the directory
   Failure/Error: chdir(@mover.target_dir)

 NoMethodError:
   undefined method `chdir' for #<RSpec::ExampleGroups::Mover::Chdir:0x007ffae608f898> # ./spec/models/mover_spec.rb:18:in `block (3 levels) in <top (required)>'

代码本身:

class Mover
  $home = Dir.home

  attr_accessor :file_type, :working_dir, :target_dir

  def initialize(file_type, working_dir, target_dir)
    @file_type = file_type
    @working_dir = working_dir
    @target_dir = target_dir
  end

  def chdir(dir)
  end


end

mover = Mover.new("/Screen Shot\s\d*.\d*.\d*\sat\s.*.png/g", "Desktop", "/Desktop/screenshots")

然后是规范:

describe Mover do
  before do
    @mover = Mover.new("/Screen Shot\s\d*.\d*.\d*\sat\s.*.png/g", "Desktop", "/Desktop/screenshits")
  end

  describe "#initialize" do
    it "Initializes the object." do
      expect( @mover.class.name ).to eq("Mover")
    end
  end

  describe "#chdir" do
    it "changes the directory" do
      #chdir(@mover.target_dir)
    end
  end

end

违规行被注释掉了。我真的很难过为什么会这样。任何帮助将不胜感激。

链接到github repo,以防万一:https://github.com/swolegrammer/ruby-file-mover

1 个答案:

答案 0 :(得分:0)

您忘记使用@mover.chdir了。我会使用subject代替before { @mover = Mover.new ... }

关于使用let vs subject vs之前我建议读一下这个rspec-style-guide问题:https://github.com/reachlocal/rspec-style-guide/issues/6

describe Mover do
  subject(:mover) { Mover.new("/Screen Shot\s\d*.\d*.\d*\sat\s.*.png/g", "Desktop", "/Desktop/screenshits") }

  describe "#initialize" do
    it "Initializes the object." do
      expect(mover.class.name).to eq("Mover")
    end
  end

  describe "#chdir" do
    it "changes the directory" do
      mover.chdir(mover.target_dir)
    end
  end
end