Question

i'm developing test for REST using shoulda and factory_girl. Code below

 context "on :delete to :destroy" do
    setup do
      @controller = NewsArticlesController.new
      @request = ActionController::TestRequest.new
      @response = ActionController::TestResponse.new

      @news_article =  Factory.create(:news_article)

    end

    should "destroy new NewsArticle" do
      assert_difference('NewsArticle.count', -1) do
        delete :destroy, :id => @news_article.id
      end
    end

    should_redirect_to news_articles_path
  end

as a result i see

  1) Error:
test: on :delete to :destroy should redirect to index. (NewsArticlesControllerTest):
ArgumentError: block not supplied
    c:/develop/ruby/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/action_controller/macros.rb:201:in `instance_eval'
    c:/develop/ruby/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/action_controller/macros.rb:201:in `__bind_1248853182_16800
0'
    c:/develop/ruby/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `call'
    c:/develop/ruby/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `test: on :delete to :destroy should redirect to index. '

Could you tell me plz - whats wrong and how i can modify test to make them work right?

UPD: routes looks fine

news_articles GET    /news(.:format)                    {:controller=>"news_articles", :action=>"index"}
Was it helpful?

Solution

Maybe you should use a symbol and post method when calling delete:

 assert_difference 'Article.count', -1 do
    post :delete, :id => ...
  end

(referenced from http://api.rubyonrails.org/classes/ActiveSupport/Testing/Assertions.html#M001427)

OTHER TIPS

The problem is with should_redirect_to which now uses block to evaluate the redirect code. Sadly, neither thoughtbot wiki, nor the readme at github reflect this and still contain the old examples.

The correct code is

should_redirect_to "news articles page" { news_articles_path }

where the first argument is just a textual description (it is not eval'd as with the older version) used to generate a test name, so you get a test name like 'should redirect to news articles page'

tkramar solution points in the right direction, but i've had to write the code as:

should_redirect_to("news articles page") { news_articles_path }

Also see the new manual at http://dev.thoughtbot.com/shoulda/classes/Shoulda/ActionController/Macros.html#M000015

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top