4

私は RSpec 初心者ですが、テストを書くのがいかに簡単であるかがとても気に入っています。RSpec の新しい機能を学ぶにつれて、よりクリーンになるようにテストを継続的にリファクタリングしています。だから、もともと、私は以下を持っていました:

describe Account do
  context "when new" do
    let(:account) { Account.new }
    subject { account }

    it "should have account attributes" do
      subject.account_attributes.should_not be_nil
    end
  end
end

その後、メソッドについて学んだので、次のitsように書き直そうとしました。

describe Account do
  context "when new" do
    let(:account) { Account.new }
    subject { account }

    its(:account_attributes, "should not be nil") do
      should_not be_nil
    end
  end
end

これは 2 つの引数を受け入れないために失敗しますitsが、メッセージを削除するとうまくいきます。問題は、テストが失敗した場合、失敗した例セクションの下のメッセージに次のように表示されることです。

rspec ./spec/models/account_spec.rb:23 # Account when new account_attributes

これはあまり役に立ちません。

それで、メッセージを に渡す方法はありますitsか、それともより良いのは、正常なメッセージを自動的に出力する方法ですか?

4

3 に答える 3

3

RSpec カスタムマッチャーを定義できます:

RSpec::Matchers.define :have_account_attributes do
  match do |actual|
    actual.account_attributes.should_not be_nil
  end
  failure_message_for_should do
    "expected account_attributes to be present, got nil"
  end
end

describe Account do
  it { should have_account_attributes }
end
于 2012-09-18T02:21:35.843 に答える
1

次のように書くこともできます。its(:account_attributes) { should_not be_nil }

https://www.relishapp.com/rspec/rspec-core/v/2-14/docs/subject/attribute-of-subjectを参照してください

ただし、「その」は rspec 3 のリリースで rspec-core から gem に抽出されることに注意してください。

于 2013-06-01T19:51:21.340 に答える
0

比較的単純なモンキー パッチで、求めるものを実現できるようです。

使用している rspec-core gem バージョンのソースを見てください。私は2.10.1を使用しています。ファイルlib/rspec/core/subject.rbには、its定義されたメソッドが表示されます。

パッチを適用したバージョンは次のとおりdefです。行とその後の行を変更しました。

注意 - これはバージョン固有である可能性が非常に高いです! あなたのバージョンからメソッドをコピーし、私と同じように変更してください。rspec-core 開発者がコードの大規模な再構築を行った場合、パッチは非常に異なるものになる可能性があることに注意してください。

module RSpec
  module Core
    module Subject
      module ExampleGroupMethods
        # accept an optional description to append
        def its(attribute, desc=nil, &block)
          describe(desc ? attribute.inspect + " #{desc}" : attribute) do
            example do
              self.class.class_eval do
                define_method(:subject) do
                  if defined?(@_subject)
                    @_subject
                  else
                    @_subject = Array === attribute ? super()[*attribute] : _nested_attribute(super(), attribute)
                  end
                end
              end
              instance_eval(&block)
            end
          end
        end
      end
    end
  end
end

そのパッチはおそらくあなたのspec_helper.rb.

今の使い方:

its("foo", "is not nil") do
  should_not be_nil
end

失敗時の出力:

rspec ./attrib_example_spec.rb:10 # attr example "foo" is not nil 

2 番目の引数を省略すると、動作はパッチを適用していないメソッドと同じになります。

于 2012-09-14T17:58:52.333 に答える