我正在尝试编写一个测试来断言所有定义的操作都在成功运行时被调用。我在列表中定义了给定进程的操作,并从容器中解析它们,如下所示:
class ProcessController
def call(input)
operations.each { |o| container[o].(input) }
end
def operations
['operation1', 'operation2']
end
def container
My::Container # This is a Dry::Web::Container
end
end
然后我测试如下:
RSpec.describe ProcessController do
let(:container) { My::Container }
it 'executes all operations' do
subject.operations.each do |op|
expect(container[op]).to receive(:call).and_call_original
end
expect(subject.(input)).to be_success
end
end
这会失败,因为container[operation_name]
从内部调用ProcessController
和从测试内部调用会产生不同的操作实例。我可以通过比较对象 ID 来验证它。除此之外,我知道代码工作正常并且所有操作都被调用。
容器配置为自动注册这些操作,并在测试开始运行之前完成。
如何使解析相同的键返回相同的项目?