我正在使用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
不知怎的,它没有过去。
这是什么原因?是否有更好的方法来写它?
答案 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方法以及错误中的预期字符串来验证产品是否因无效而无效。