对我正在执行依赖项注入的方法进行单元测试

时间:2019-03-03 17:09:39

标签: ruby unit-testing rspec

我有一个包含两个类的终端应用程序:Todo和TodoApp。下面的方法存在于TodoApp中,我想对该方法进行单元测试并将其隔离在测试中。由于我正在方法中进行依赖项注入,因此该如何模拟呢? (@todos是TodoApp初始化中的空数组)

 def add(task, day, todo = Todo)
    @todos.push(todo.new(task, day))
    return "#{task} was added to your todos"
 end

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我想您的代码看起来像这样。

class TodoApp
  def initialize 
    @todos = []
  end

  def add(task, day, todo = Todo)
    @todos.push(todo.new(task, day))
    return "#{task} was added to your todos"
  end
end

这不是将空数组注入TodoApp。而且,因此您将很难从测试中访问它。

但是,如果您的TodoApp对象看起来像这样:

class TodoApp
  def initialize(todos = [])
    @todos = todos
  end

  def add(task, day, todo = Todo)
    @todos.push(todo.new(task, day))
    return "#{task} was added to your todos"
  end
end

现在您正在向TodoApp中注入一些可以被嘲笑甚至可以被评估的东西:

describe TodoApp do
  subject(:app) { described_class.new(todos) }

  let(:todos) { [] }

  describe '#add' do
    subject(:add) { app.add(task, day) }

    let(:task) { 'task' }
    let(:day) { 'day' }

    it 'pushes the item on the list of todos' do
      expect { add }.to change { todos.length }.by(1)
    end
  end
end