0

我正在使用 Rails 3.2 的 rake 测试功能。我正在尝试通过测试,但它给了我错误。顺便说一句,当你看到我的写作方式时,我是个菜鸟。这是一种被黑的测试方式,但至少我想先尝试通过它。

  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 回答