【发布时间】:2021-09-24 19:26:52
【问题描述】:
我有一个控制器,它在发出获取请求时调用 CSVCreator 类。 People 只是具有一些基本值(如姓名和头衔)的 Person 列表。
def index
respond_to do |format|
format.html
format.csv { send_data CSVCreator.new(people).create }
end
我的 CSVCreator 看起来像这样
class CSVCreator
HEADERS = ["Name", "Date", "Title"].freeze
def initialize(people)
@people = people
end
def generate
CSV.generate do |csv|
csv << HEADERS
@people.each do |person|
row = [person.name, person.date, person.title]
csv << row
end
end
end
end
我想知道如何在 Rspec 中进行测试?我试过的是
it "calls CSVCreator when get request is made" do
csv_creator = double("CSVCreator")
people = double("People")
allow(csv_creator).to receive(:new).with(people)
allow(csv_creator).to receive(:create)
expect(csv_creator).to receive(:new).with(people)
expect(csv_creator).to receive(:create)
get :index, format: :csv
end
我的想法是将控制器与 CSVCreator 和 People 类解耦。所以为了测试控制器,我想看看它是否正确调用了它需要的方法,所以我为这些对象创建了测试替身。我是 RSpec 和一般测试的新手,所以如果我的方法不正确,请告诉我。
我的问题是,我说失败了
Failure/Error: expect(csv_creator).to receive(:new).with(people)
(Double "CSVCreator").new(#<Double "People">)
expected: 1 time with arguments: (#<Double "People">)
received: 0 times
我知道我的课程有效,它创建了 CSV,并且在控制器中调用了 CSVCreator.new(people).create。所以我很好奇为什么我会收到这个失败。
【问题讨论】:
标签: ruby-on-rails ruby rspec