单元测试我正在进行依赖注入的方法
Unit testing a method in which I am doing a dependency injection
我有一个包含两个 类 的终端应用程序:Todo 和 TodoApp。下面的方法存在于 TodoApp 中,我想对该方法进行单元测试并将其隔离在我的测试中。由于我在方法中进行依赖注入,我怎么能模拟它呢? (@todos 是 TodoApp initialize 中的一个空数组)
def add(task, day, todo = Todo)
@todos.push(todo.new(task, day))
return "#{task} was added to your todos"
end
在此先感谢您的帮助。
我想你的代码应该是这样的。
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
我有一个包含两个 类 的终端应用程序:Todo 和 TodoApp。下面的方法存在于 TodoApp 中,我想对该方法进行单元测试并将其隔离在我的测试中。由于我在方法中进行依赖注入,我怎么能模拟它呢? (@todos 是 TodoApp initialize 中的一个空数组)
def add(task, day, todo = Todo)
@todos.push(todo.new(task, day))
return "#{task} was added to your todos"
end
在此先感谢您的帮助。
我想你的代码应该是这样的。
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