Problem
You need to have to functionally test your controller when you are using ActiveScaffold. There are pieces of code that tell you how to do that on a normal ror application (ie without ActiveScaffold), like recipe 7.17 on the Rails Cookbook, or a fragment of code in an Active Scaffold application, but they don’t have the full details.
Solution
Here is an attempt to give some more detailed step by step instructions on how to do it.
- The migration for the example customer model.
class CreateCustomers < ActiveRecord::Migration
def self.up
# Create customers table
create_table :customers do |t|
t.column :customer_code, :string, :null => false
t.column :created_at, :datetime
t.column :updated_at, :datetime
end
end
end
- The customer model, with the extra function to display the customer code
class Customer < ActiveRecord::Base
has_many :numbers
def to_label
"#{customer_code}"
end
end
- The customer controller app/controllers/customers_controller.rb, using the Active Scaffold
class CustomersController < ApplicationController
active_scaffold :customer do |config|
config.list.columns = [:customer_code, :numbers, :created_at, :updated_at]
config.columns[:customer_code].inplace_edit = true
end
end
- The fixtures YML file test/fixtures/customers.yml
first_customer:
id: 1
customer_code: 123
created_at: 2007-09-26 11:17:07
updated_at: 2007-09-26 11:17:07
second_customer:
id: 2
customer_code: 456
created_at: 2007-09-26 11:17:13
updated_at: 2007-09-26 11:17:13
- And here are some functions to test some pages and a full CRUD test
require File.dirname(__FILE__) + '/../test_helper'
require 'customers_controller'
class CustomerControllerTest < Test::Unit::TestCase
fixtures :customers
def setup
@controller = CustomersController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
def test_index
get :index
assert_response :success
assert_template 'list'
end
def test_new
get :new
assert_response :success
assert_template 'create_form'
end
def test_edit
get :edit, :id => customers(:first_customer).id
assert_response :success
assert_template 'update_form'
end
def test_show
get :show, :id => customers(:first_customer).id
assert_response :success
assert_template 'show'
end
def test_customer_controller_CRUD
# CREATE
# Get the number of records
record_no = Customer.count
# Create a new record
post :create, {"commit"=>"Create", :record=>{"customer_code"=>"890"}}
# Assert that the record is not nil
assert_not_nil assigns("record")
# Look that the number of records has been increased by 1
assert_equal record_no+1, Customer.count
# UPDATE
# Get the number of records
record_no = Customer.count
# Update a record
new_customer_code = "987"
put :update, {"commit"=>"Update",:id=>customers(:first_customer).id,
:record=>{"customer_code"=>new_customer_code}}
# Assert that the record is not nil
assert_not_nil assigns("record")
# Look that the number of records has stayed the same
assert_equal record_no, Customer.count
# Check that the update took place
customer = Customer.find(customers(:first_customer).id)
assert_equal new_customer_code, customer.customer_code
# DELETE
# Get the number of records
record_no = Customer.count
# Delete a record
delete :destroy, :id => customers(:first_customer).id
# Look that the number of records has been decreased by 1
assert_equal record_no-1, Customer.count
end
end