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.
- The customer model, with the extra function to display the customer code
- The customer controller app/controllers/customers_controller.rb, using the Active Scaffold
- The fixtures YML file test/fixtures/customers.yml
- And here are some functions to test some pages and a full CRUD test
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
class Customer < ActiveRecord::Base has_many :numbers def to_label "#{customer_code}" end end
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
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
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