我有一个包含两个类的终端应用程序: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
预先感谢您的帮助。
答案 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