我使用Rails 5.1并且在简单的控制器测试方面遇到了一些麻烦。
我用脚手架创建了一个非常标准的Rails应用程序:
rails g scaffold产品名称:字符串描述:文本 image_url:字符串价格:十进制
所有CRUD操作都按预期工作。
但是我的控制器测试让我很头疼:
我在app / assets / images文件夹中有引用的测试图像文件。
在test / controllers / products_controller_test.rb中:
require 'test_helper'
class ProductsControllerTest < ActionDispatch::IntegrationTest
setup do
@product = products(:one)
@update = {
title: ' Lorem ipsum ',
description: ' Rails is great! ',
image_url: ' rails.png ',
price: 19.99
}
end
test "should create product" do
assert_difference('Product.count') do
post products_url, params: { product: @update }
end
assert_redirected_to product_url(Product.last)
end
end
在app / models / product.rb中:
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
在test / fixtures / files / products.yml中:
one:
title: MyString
description: MyText
image_url: rails.png
price: 9.99
two:
title: Foo
description: Bar
image_url: MyString.png
price: 9.99
我收到的错误消息是:
Failure:
ProductsControllerTest#test_should_create_product [myapp/test/controllers/products_controller_test.rb:25]:
"Product.count" didn't change by 1.
Expected: 3
Actual: 2
看起来我的测试无法创建新的产品条目。我该如何解决?
答案 0 :(得分:2)
' rails.png '
不符合image_url
验证的格式,请检查here。
如果您希望为产品创建新记录,请考虑删除空格或调整正则表达式。这样就可以了:
@update = {
title: ' Lorem ipsum ',
description: ' Rails is great! ',
image_url: 'rails.png',
price: 19.99
}