2012-05-21 166 views
0

我正在使用Rails 3.2的耙测试功能。我试图通过测试,但它给我错误。顺便说一句,当你看到我如何写作时,我是一个小菜鸟。这是一种黑客测试方式,但至少我想先尝试传递它。通过简单测试

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

请发表您的错误信息 – uday

回答

1

我更关心这个方法。我假设这种方法在产品模型中?看起来你试图去做的事情应该完全由模型来控制,但我认为你不能在类的定义中调用类的方法。在创建具有指定标题的新产品但静态描述,价格和image_url的方法中,我也没有看到太多实用工具。如果您需要特定属性的默认值,则可以将它们设置为initialize方法,并在需要时稍后覆盖它们。有些人不赞成在初始化设置默认因此,你可以在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方法,并从错误期望的字符串正确的理由无效。

+0

感谢您的支持。它现在有效! – user1372829