4

編集: @max の提案に従って、代わりに列挙型を使用するようにモデルを変更していますが、デフォルトの状態でテストすることはできません:

it { is_expected.to validate_inclusion_of(:status).to_allow("draft", "published") }

モデル内の次のコードで正常に動作します。

validates :status,        :inclusion => { :in => ["draft", "published"] }

しかし、この部分はまだ失敗します:

it { is_expected.to have_field(:status).with_default_value_of("draft") }

私は Mongoid を使用していることに注意してください。私はモデル仕様にこれを持っています:

古い質問 - 参照用に保管していますか?

it { is_expected.to have_field(:published).of_type(Boolean).with_default_value_of(false) }

そして、私のモデルではこれがあります:

field :published,         type: Mongoid::Boolean,     default: false

まだ機能していません。Mongoid ビットを削除しようとしましたが、同じエラーが発生します。

Failure/Error: it { is_expected.to have_field(:published).of_type(Boolean).with_default_value_of(false) } Expected Post to have field named "published" of type Boolean with default value of false, got field "published" of type Mongoid::Boolean

注:私も試しました:

field :published,         type: Boolean,     default: false

そして、私のモデルに次のメソッドを追加しました:

after_initialize :set_published, :if => :new_record?

それから

private
def set_published
  self.published ||= false
end

しかし、何も機能していないようです。私は何が欠けていますか?

4

2 に答える 2

2

私の理解が正しければ、モデルで と の両方を試しましたが、テストでは試しませんでしたMongoid::BooleanBoolean

テスト失敗メッセージを考えると、次のようになるはずです。

it { is_expected.to have_field(:published).of_type(Mongoid::Boolean).with_default_value_of(false) }

(そしてfield :published, type: Mongoid::Boolean, default: falseあなたのモデルで)

2番目の問題:

have_fieldフィールドがデータベースに存在することを確認するのではなく、ビュー (生成された HTML) でテストを行うことを認識していますか?

あなたの意見のコードがなければ、私たちはあなたを助けることができません.

デフォルト値が であることを確認するにはdraft、組み込みの Rails テスト メソッドを知らないので、手動で行う必要があります。最初にモデルの新しいインスタンスを作成して保存し、公開されたフィールドにdraft値があることを確認します。

私は Rspec とあなたが使用している構文に精通していませんが、次のようなものでなければなりません (モデルの名前が であると仮定しますPost):

before {
    @post = Post.new
    # some initialization code if needed
    @post.save
}
expect(@post.published).to be("draft")
于 2015-07-08T17:53:34.567 に答える
2
class Article
  include Mongoid::Document
  field :published, type: Boolean, default: false
end

require 'rails_helper'

RSpec.describe Article, type: :model do
  it { is_expected.to have_field(:published)
                      .of_type(Mongoid::Boolean)
                      .with_default_value_of(false) }
end

mongoid (4.0.2)、 で完全に問題なく通過しmongoid-rspec (2.1.0)ます。

しかし、率直に言って、モデルの状態にブール値を使用することは最適ではありません。

ブログの投稿または記事を検討する場合、次のようになります。

 1. draft
 2. published
 3. deleted
 4. ... 

モデルに N 個のスイッチを追加するのは面倒です。すばらしい解決策は、Enum を使用することです。

最初に仕様を書きます。

RSpec.describe Article, type: :model do

  specify 'the default status of an article should be :draft' do
    expect(subject.status).to eq :draft
  end

  # or with rspec-its
  # its(:status) { should eq :draft }
end

次にgem "mongoid-enum"、Gemfile に追加します。

最後に enum フィールドを追加します。

class Article
  include Mongoid::Document
  include Mongoid::Enum
  enum :status, [:draft, :published]
end

列挙型は、このすべての素晴らしさを追加します:

Article.published # Scope to get all published articles
article.published? # Interrogation methods for each state.
article.published! # sets the status
于 2015-07-08T17:47:13.020 に答える