通过一个简单的测试

时间:2012-05-21 04:04:31

标签: ruby-on-rails testunit

我正在使用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
不知怎的,它没有过去。

这是什么原因?是否有更好的方法来写它?

1 个答案:

答案 0 :(得分: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")

如果你不想要所有的默认值,你可以像往常一样将值传递给新的

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方法以及错误中的预期字符串来验证产品是否因无效而无效。