我如何期望一个方法 运行 具有特定的 ActiveRecord 参数
How do I expect a method to be run with specific ActiveRecord parameters
在 Rails 4.2 上使用摩卡。
我正在测试一种方法,它应该使用正确的参数调用另一个方法。这些参数是它从数据库调用的 ActiveRecord 对象。这是我测试中的关键行:
UserMailer.expects(:prompt_champion).with(users(:emma), [[language, 31.days.ago]]).once
users(:emma)
和 language
都是 ActiveRecord 对象。
虽然调用正确,但由于参数不符合预期,测试失败。我认为这可能是因为每次从数据库中提取记录时它都是一个不同的 Ruby 对象。
我认为解决它的一种方法是查看我的代码中使用了什么方法来提取记录并将该方法存根到 return 模拟,但我不想这样做,因为检索一大堆记录,然后过滤以找到正确的记录,模拟所有这些记录会使测试方式过于复杂。
有更好的方法吗?
您可以使用 RSpec custom matcher 并比较该函数中的预期值。
您可以使用 allow/expect 的块形式。
expect(UserMailer).to receive(:prompt_champion) do |user, date|
expect(user.name).to eq "Emma"
expect(date).to eq 31.days.ago # or whatever
end
Sergio给出了最佳答案,我接受了。我独立找到了答案,并一路发现我需要 return 来自 ActionMailer 方法的模拟才能使一切正常工作。
我认为最好 post 这里是我的完整测试,以防任何其他倒霉的冒险者来到这里。我正在使用 Minitest-Spec。
it 'prompts champions when there have been no edits for over a month' do
language.updated_at = 31.days.ago
language.champion = users(:emma)
language.save
mail = mock()
mail.stubs(:deliver_now).returns(true)
UserMailer.expects(:prompt_champion).with do |user, languages|
_(user.id).must_equal language.champion_id
_(languages.first.first.id).must_equal language.id
end.once.returns(mail)
Language.prompt_champions
end
在 Rails 4.2 上使用摩卡。 我正在测试一种方法,它应该使用正确的参数调用另一个方法。这些参数是它从数据库调用的 ActiveRecord 对象。这是我测试中的关键行:
UserMailer.expects(:prompt_champion).with(users(:emma), [[language, 31.days.ago]]).once
users(:emma)
和 language
都是 ActiveRecord 对象。
虽然调用正确,但由于参数不符合预期,测试失败。我认为这可能是因为每次从数据库中提取记录时它都是一个不同的 Ruby 对象。
我认为解决它的一种方法是查看我的代码中使用了什么方法来提取记录并将该方法存根到 return 模拟,但我不想这样做,因为检索一大堆记录,然后过滤以找到正确的记录,模拟所有这些记录会使测试方式过于复杂。
有更好的方法吗?
您可以使用 RSpec custom matcher 并比较该函数中的预期值。
您可以使用 allow/expect 的块形式。
expect(UserMailer).to receive(:prompt_champion) do |user, date|
expect(user.name).to eq "Emma"
expect(date).to eq 31.days.ago # or whatever
end
Sergio给出了最佳答案,我接受了。我独立找到了答案,并一路发现我需要 return 来自 ActionMailer 方法的模拟才能使一切正常工作。
我认为最好 post 这里是我的完整测试,以防任何其他倒霉的冒险者来到这里。我正在使用 Minitest-Spec。
it 'prompts champions when there have been no edits for over a month' do
language.updated_at = 31.days.ago
language.champion = users(:emma)
language.save
mail = mock()
mail.stubs(:deliver_now).returns(true)
UserMailer.expects(:prompt_champion).with do |user, languages|
_(user.id).must_equal language.champion_id
_(languages.first.first.id).must_equal language.id
end.once.returns(mail)
Language.prompt_champions
end