1

Here is my test using Test/Unit:

test "signin and signout" do
  user = users(:alex)

  get signin_path
  assert_select 'h1', 'Sign In'

  # signing in...
  post_via_redirect signin_path,
                    email: user.email,
                    password: strong_pass
  assert_select 'a#current-user', "#{user.first_name} #{user.last_name}"
  assert_select 'a#signout', 'Sign Out'

  #signing out...
  delete_via_redirect signout_path
  assert_equal signin_path, path
  assert_select 'h1', 'Sign In'
  assert_select 'a#signin', 'Sign In'
end

And the result:

1) Failure:
   UserFlowsTest#test_signin_and_signout
   Expected at least 1 element matching "h1", found 0..
   Expected 0 to be >= 1.

As you can see in the begining after get signin_path I have my h1 with signin text.
Also after
delete_via_redirect signout_path
my
assert_equal signin_path, path
is also ok.
But assert_select 'h1' can't find any h1.
And moreover I checked that
assert_select 'a#signout', 'Sign Out'
at this point is still true.

My methods:

def destroy
  sign_out
  redirect_to signin_url
end

def sign_out
  cookies.delete(:remember_token)
  self.current_user = nil
end

So method destroy redirected me to signin_url, but I still have signout-link and don't have any h1 (it's the most strange part).

I tested it with Capybara:

test "sign_out link" do
  user = users(:alex)

  sign_in user, capybara: true
  assert page.has_link?('Sign Out', href: signout_path)
  click_link 'Sign Out'
  assert page.has_selector?('h1', text: 'Sign In')
end

... and it passed.

So what's wrong with my test/unit test?

4

1 回答 1

2

尝试delete方法,然后follow_redirect!方法而不是 delete_via_redirect。它在我的类似情况下使用 patch_via_redirect 方法工作。

于 2014-03-03T15:13:25.197 回答