简体   繁体   中英

Ruby on Rails Tutorial Chapter 7 Integration Test Argument Error

Just starting with Rails and am working my way through Ruby on Rails Tutorial 6th edition. Things have been going great, been able to fix all issues, until now. I'm stuck on Chapter 7.3.4 while testing for Invalid Form Submissions: When running tests I receive the following:

ERROR["test_invalid_signup_information", #<Minitest::Reporters::Suite:0x00000001390c2d78 @name="UsersSignupTest">, 0.7315919999964535]
 test_invalid_signup_information#UsersSignupTest (0.73s)
Minitest::UnexpectedError:         ArgumentError: wrong number of arguments (given 2, expected 1)
            test/integration/users_signup_test.rb:8:in `block in <class:UsersSignupTest>'

  17/17: [===============================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.82379s
17 tests, 33 assertions, 0 failures, 1 errors, 0 skips

Here is the test file. I've tried testing both files and they produce the same error:

require "test_helper"

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    before_count = User.count
    post users_path, params: { user: { name: '',
                                       email: 'user@invalid',
                                       password:              'foo',
                                       password_confirmation: 'bar' } }
    after_count = User.count
    assert_equal before_count, after_count
    assert_template 'users/new'
  end
end
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'
  end
end

This is my first experience with Rails so any help would be super appreciated!

Found a solution for this: treat the arguments to the call to post as one by removing the comma. Pretty sure it should throw a Syntax error but for some reason it doesn't and this passes all tests. New code:

equire 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'
  end
end

I have been dealing with the same issue for about two days now.

Here's what I have discovered:

  • Put the following command in the start of the test

    p method(:post)

  • Run rails test again and get the following message

    #<Method: UsersSignupTest(Rails::Controller::Testing::Integration)#post(*args) /home/<your_name>/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/rails-controller-testing-0.0.3/lib/rails/controller/testing/integration.rb:10>

    We can see here that the post method has indeed 1 Argument and the gem responsible is the rails-controller-testing.

Solution

By deleting the rails-controller-testing gem from Gemfile and run bundle install again the post method will accept 2 Arguments without an error as described in the Rails Documentation.

The problem that rises, however, is that the assert_template commands will prompt you to reinstall the gem while running rails test .

Try using assert_response or assert_select instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM