0

Rails 3.2 の rake tests 関数を使用しています。テストに合格しようとしていますが、エラーが発生します。ところで、私がどのように書いているかを見ると、私は初心者です。ハッキングされたテスト方法ですが、少なくとも最初はパスしてみたいと思います。

  test "product title must have at least 10 characters" do
    ok = %w{ aaaaaaaaaa aaaaaaaaaaa }
    bad = %w{ a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa}

    ok.each do |name|
        assert new_product_title(name).valid?, "#{name} shouldn't be invalid"
    end

    bad.each do |name|
        assert new_product_title(name).invalid?, "#{name} shouldn't be valid"
    end
  end

関数で

def new_product_title(title)
    Product.new(title: title,
        description: "yyy",
        price: 1,
        image_url: "fred.gif")
end

なんだか通らない。

ここに理由は何ですか?そして、それを書くためのより良い方法はありますか?

4

1 に答える 1

1

それよりも方法が気になります。このメソッドは製品モデルにあると思いますか? あなたがやろうとしていることは間違いなくモデルによって制御されるべきだと思われますが、クラスの定義内でクラスのメソッドを呼び出すことはできないと思います。また、指定されたタイトルで新しい製品を作成するメソッドにはあまり有用性が見られませんが、説明、価格、および image_url は静的です。特定の属性のデフォルト値が必要な場合は、初期化メソッドでそれらを設定し、必要に応じて後で上書きできます。初期化でデフォルトを設定することに眉をひそめる人もいるので、代わりに、次のように after_initialize コールバックで設定できます。

class Product < ActiveRecord::Base
  after_initialize :init

  def init
    self.description ||= 'yyy'
    self.price ||= 1
    self.image_url ||= "fred.gif"
  end
end

次に、タイトルとデフォルトの属性を使用して新しい製品を作成する必要があるときはいつでも、使用できます

Product.new(:title => "some title")

そして、すべてのデフォルトが必要ない場合は、通常のように値を new に渡すだけです

Product.new(:title => "some other title", :price => 400) # desc & url are still default

あなたのテストについて。私はいつもRSpecでテストしています。テスト ユニット (またはミニ テストなど) を使用しているため、私のアドバイスは正しくありません。しかし、最初に、変数名をよりわかりやすいものにします。第二に、アサーションの最後にあるべきではないコンマがいくつかあります。

test "product title must have at least 10 characters" do
  valid_name = "a" * 10
  short_name = "a" * 9

  valid_product = Product.new(:name => valid_name)
  assert valid_product.valid?

  invalid_product = Product.new(:name => short_name)
  assert invalid_product.invalid?
end

それが機能するようになったら、invalid_product.errors.full_messages で assert equals メソッドを使用し、エラーから予想される文字列を使用して、製品が正しい理由で無効であることを確認することをお勧めします。

于 2012-05-21T05:28:08.383 に答える