Thursday, December 30, 2010

Rails4: Iteration B2 - generic def for new default valid products

Building on example for "def new_product(image_url)" pg. 101

#a generic method to build new test produce with valid data
#but also allow insertion of any attributes that need to be over-ridden
#takes a hash of attribute values, checks for each and populates default as needed.
#don't add this to real Product, 'cause production code shouldn't provide defaults.
def new_valid_product(data)
Product.new(
:title => data.has_key?(:title) ? data[:title] : "A Book Title",
:description => data.has_key?(:description) ? data[:description] : "ipso lorum... a default description",
:price => data.has_key?(:price) ? data[:price] : 123.45,
:image_url => data.has_key?(:image_url) ? data[:image_url] : "test.gif"
)
end

#a quick test to warn me if any rules change that invalidate the default values.
test "default product attributes are valid" do
product = new_valid_product({})
assert !product.errors[:title].any?, "default title in error"
assert !product.errors[:description].any?, "default_description in error"
assert !product.errors[:price].any?, "default_price in error"
assert !product.errors[:image_url].any?, "default image_url in error"
end

#a quick test to prove to myself that the method accepts input data & uses it correctly.
test "default product attributes can be changed" do
product = new_valid_product({:title => "T", :description => "D", :price => 1, :image_url => "I"})
assert_equal "T", product.title
assert_equal "D", product.description
assert_equal 1, product.price
assert_equal "I", product.image_url
end

Note: My guess it that this kind of method is not really useful, Ruby has fixtures, my suspicion is that in time I'll find it much easier to define and get a fixture, then change a value or two, rather than write this kind of utility method for each model unit test class.

1 comment:

  1. Note for future:

    Example test fixture has: assert_select '#main .entry', 3

    brittle test, add any new products in yaml and breaks this test, cause in reality all fixtures are being added.

    better test: assert_select '#main .entry', Product.count

    Also note on old habits. Tests run with fixtures not DB data. Means if your test fails, you can't just go to the web page to see what's wrong. In this case products still were 3, but fixtures now 4 (not seen)

    ReplyDelete