mercredi 9 septembre 2015

Functional Tests in Redmine?

I got some problems when writing the functional tests for my Redmine plugin. Well, I created a plugin in Redmine named Polls, in controller I defined two function named index and vote as bellow:

class PollsController < ApplicationController
  unloadable
  before_filter :find_project, :authorize, :only => :index
  def index
    @polls = Poll.all
  end

  def vote
    poll = Poll.find(params[:id])
    poll.vote(params[:answer])
    if poll.save
      flash[:notice] = 'Vote saved.'
    end
    redirect_to :action => 'index'
  end
  private

  def find_project
    # @project variable must be set before calling the authorize filter
    @project = Project.find(params[:project_id])
  end
end

The index function will list all data in Polls table (the data get from sample data in polls.yml file and fetch to table Polls) and display inside each project was created. Here is my sample data in polls.yml file:

poll_001:
    id: 1
    question: Can you see this poll?
    is_yes: 2
    is_no: 0
poll_002:
    id: 2
    question: And can you see this other poll?
    is_yes: 1
    is_no: 0

And the vote function will increment for each answer by one, the answer get from user. I have been defined the vote function in my model and invoked it at here. Block code of the vote function in Poll model:

class Poll < ActiveRecord::Base

    def vote(answer)
        increment(answer == 'yes' ? :is_yes : :is_no)
    end
end

For now, I writing two test cases in functional tests:

require File.expand_path('../../test_helper', __FILE__)
class PollsControllerTest < ActionController::TestCase
    fixtures :projects, :users, :roles, :members, :polls
    def setup
        @project = Project.find(1)
        User.current = User.find(2)
        @request.session[:user_id] = 2
        @poll = Poll.all
    end

    test "index" do
        Role.find(1).add_permission! :view_polls
        get :index, :project_id => @project.id
        assert_response :success
        assert_template 'index'
    end

    test "vote" do
        post :vote, {:id => 1, :answer => 'no'}
        assert_equal 'Vote saved.', expect(flash[:notice])
        assert_response :success
        assert_template 'index'
    end
end 

I get an error while run test index:

# Running:
F
Finished in 1.051095s, 0.9514 runs/s, 0.9514 assertions/s.
  1) Failure:
PollsControllerTest#test_index [polls_controller_test.rb:14]:
Expected response to be a <success>, but was <403>
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips

and while run test vote:

# Running:

E

Finished in 0.288799s, 3.4626 runs/s, 0.0000 assertions/s.

  1) Error:
PollsControllerTest#test_vote:
NoMethodError: undefined method `expect' for #<PollsControllerTest:0x7c71c60>


1 runs, 0 assertions, 0 failures, 1 errors, 0 skips

Have a great day!

Aucun commentaire:

Enregistrer un commentaire