3

このブログ投稿を見ると、マッチャーを使用する機能をセットアップしようとしていますObject.should have_received(:action).with(*params)が、それを取得できないようです。物事を分解するために、私は本当に本当に単純なrakeタスクを書きました:

# lib/tasks/check_log.rake
namespace :check_log do
  # other tasks omitted

  desc "Task description"
  task :test => :environment do
    ImportRecording.log.debug "Something"
  end
end

そして、ここに私が書いたテストがありますspec/lib/tasks/check_log_rake_spec.rb

require_relative '../../support/shared_contexts/rake'
# other requirements omitted
describe "check_log:test", focus: true do
  include_context "rake"

  let(:log_name) { "import.log" }
  let(:checker) { CheckLog.new log_name }
  let(:import_log) { ImportRecording.log }
  let(:message) { "Asterisk import finished!" }

  it "verify a method was called on a log" do
    subject.invoke
    ImportRecording.log.should have_received(:debug).with("Something")
  end
end

前述のブログ投稿の厚意により、これが私の共有コンテキストです。spec/support/shared_contexts/rake.rb

require "rake"

shared_context "rake" do
  let(:rake)      { Rake::Application.new }
  let(:task_name) { self.class.top_level_description }
  let(:task_path) { "lib/tasks/#{task_name.split(":").first}" }
  subject         { rake[task_name] }

  def loaded_files_excluding_current_rake_file
    $".reject {|file| file == Rails.root.join("#{task_path}.rake").to_s }
  end

  before do
    Rake.application = rake
    Rake.application.rake_require(task_path,[Rails.root.to_s],loaded_files_excluding_current_rake_file)

    Rake::Task.define_task(:environment)
  end
end

rspec-spiesだから私は宝石をインストールし、次の行を私のspec_helper

require `rspec-spies`

しかし、テストを実行すると、次のエラーが発生します。

Failure/Error: ImportRecording.log.should have_received(:debug).with("Something")
   expected #<Logger:0x007ffbbe4638b0 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007ffbbe463108 @datetime_format=nil>,
   @formatter=#<Logger::SimpleFormatter:0x007ffbbe462960 @datetime_format="%F %T">,
   @logdev=#<Logger::LogDevice:0x007ffbbe462f28 @shift_size=1048576, @shift_age=0,
   @filename="/Users/brad/code/ruby/rails_projects/rl4/log/import.log",
   @dev=#<File:/Users/brad/code/ruby/rails_projects/rl4/log/import.log>,
   @mutex=#<Logger::LogDevice::LogDeviceMutex:0x007ffbbe462e60 @mon_owner=nil,
   @mon_count=0, @mon_mutex=#<Mutex:0x007ffbbe462af0>>>,
   @mock_proxy=#<RSpec::Mocks::Proxy:0x007ffbbae76a68 @object=#<Logger:0x007ffbbe4638b0 ...>,
   @name=nil, @error_generator=#<RSpec::Mocks::ErrorGenerator:0x007ffbbae76a18 @declared_as="Mock",
   @target=#<Logger:0x007ffbbe4638b0 ...>, @name=nil>,
   @expectation_ordering=#<RSpec::Mocks::OrderGroup:0x007ffbbae769c8 @ordering=[]>,
   @messages_received=[], @options={}, @already_proxied_respond_to=false,
   @null_object=false>> to have received :debug with ["Something"]

ただし、行が書き込まれていることを確認しました。メソッドを間違って使用していますか、誰かがここで正しい方向を指すことができますか?

4

1 に答える 1

2

この READMEによると、私は test-spies を誤解していました。これらは実際には 2 段階のプロセスであり、

  1. 呼び出されると予想されるメソッドをスタブします
  2. 上位のメソッドまたはプロセスを呼び出す
  3. マッチャーを使用して、have_receivedスタブ化されたものが実際に呼び出されたことを確認します

テストにこれらの変更を加えることで、すべての問題が修正されました。

于 2013-05-24T21:11:05.430 に答える