1

我是新手,正在尝试使用 Rails 的敏捷 Web 开发,第四版(适用于 Rails 3.2)一书来学习 Rails。到目前为止,能够顺利通关所有章节。如果有错误,通常是我草率的代码(忘记了逗号、'end' 语句等)。但是现在我在模型单元测试一章中遇到了障碍。在我们验证图像 URL 是否以 .gif、.jpg 或 .png 结尾的部分。

我从书中逐字复制了 depot/test/product_test.rb 文件的代码:

test "image url" do
ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg http://a.b.c/x/y/z/fred.gif }
bad = %w{ fred.doc fred.gif/more fred.gif.more }

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

但是当我运行rake test:units命令时,出现以下故障...

1) Failure:
test_image_url(ProductTest)[../depot/test/unit/product_test.rb:46]:
fred.gif shouldn't be invalid

4 tests, 13 assertions, 1 failures, 0 errors, 0 skips
rake aborted!

这是否意味着它正在测试的图像 URL 无效?如果“fred.gif 不应该无效”是正确的,为什么测试会失败?

我非常有信心这部分测试肯定是不正确的,因为我在那里进行的其他测试(例如“产品属性不能为空”、“产品价格必须为正”等)运行得很好. 如果我取出“测试图像 url”代码块,我不会失败。

请让我知道我做错了什么。如果您需要我发布整个 ProductTest,我可以。


更新:我的 Products 模型中有一个错字导致测试失败。现在都修好了。

4

4 回答 4

3

我遇到了同样的问题,我不得不更改我对 new_product 的定义。在我最初的定义中,我在“图片网址”周围加上了引号。一旦我删除了引号,我就没事了。这是代码(我最初的错误是在代码的第五行):

def new_product(image_url)
  Product.new(title:       "My Book Title",
               description: "yyy",
               price:       1,
               image_url:   image_url)
end

test "image url" do
  ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg
         http://a.b.c/x/y/z/fred.gif }
  bad = %w{ fred.doc fred.gif/more fred.gif.more }

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

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

如您所见,我没有在我的测试名称中使用“_”并且我的测试通过了。

于 2013-01-07T19:33:29.410 回答
0

好像你缺少下划线_

测试“图片网址”做

应该

测试“image_url”做

您可以在此处查看我文件中的段落:

test "image_url" do
ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg   http://a.b.c/x/y/z.gif}
bad = %w{ fred.doc fred.gif/more fred.gif.more }
ok.each do |name|
    assert new_product(name).valid?, "#{name} shouldn't be invalid"
end
bad.each do |name|
    assert new_product(name).invalid?, "#{name} shouldn't be valid"
end
于 2012-09-15T20:33:10.533 回答
0

我相信问题出在函数“new_product”的定义中。确保函数将所有字段设置为有效数据。我的没有将描述设置为有效值。我希望这有帮助。您可能已经找到了这个解决方案,但没有更新您的帖子。

我要说的是,由于其他领域,该产品正在失败。失败的测试是检查使用每个 image_url 构建的产品中是否没有错误。您只需要检查构造函数 new_product 是否可以构造一个有效的产品。

于 2012-05-31T18:57:15.577 回答
0

我只是在为此苦苦挣扎。模型也有错别字。有了我的验证。\Z我将与分组png。它需要在捕获组之外。

错误的:

class Product < ApplicationRecord
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: { greater_than_or_equal_to: 0.01 }
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
    with: %r{\.(gif|jpg|png\Z)}i, # <<<<<----
    message: 'must be a URL for GIF, JPG, or PNG image.'
  }
end

正确的:

class Product < ApplicationRecord
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: { greater_than_or_equal_to: 0.01 }
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
    with: %r{\.(gif|jpg|png)\Z}i, # <<<<<----
    message: 'must be a URL for GIF, JPG, or PNG image.'
  }
end
于 2016-11-17T17:56:22.373 回答