RoR教程第9章测试失败

时间:2011-04-04 20:30:27

标签: ruby-on-rails

我一直在阅读MHartl的教程,第9章有5个持久性错误,都与LayoutLinks有关。我已经检查并重新检查了,我没有看到我的代码与他的不同之处,但在我的计算机上运行他的代码会通过所有测试。

我已粘贴下面的错误示例,突出显示它似乎显示根页面(通过“访问root_path”),即使在经过“factory(:user) - > fill_in info”后仍未登录 - > click_button“指令集。所以在那里,我认为我要么只是丢失了logged_in状态,要么根本没有注册。

有什么见解?非常感谢。这非常令人困惑。

这是错误的一个例子:

LayoutLinks when signed in should have a signout link
     Failure/Error: response.should have_selector("a", :href => signout_path,
       expected following output to contain a <a href='/signout'>Sign Out</a> tag:
       <!DOCTYPE html>
       <html>
       <head>
...
...
<li><a href="/">Home</a></li>
             <li><a href="/help">Help</a></li>
               <li><a href="/signin">Sign in</a></li>
           </ul></nav></header><!--
       <header>
         <nav class="round">
           <ul>
             <li><a href="/">Home</a></li>


             <li><a href="/help">Help</a></li>

             <li><a href="/signin">Sign In</a></li>
           </ul>
         </nav>
...

8 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,并意识到Factory(:user)调用没有将用户持久化到数据库,我最终使用以下内容使其工作:

  @user = Factory(:user)
  visit signup_path
  fill_in :email, :with => @user.email
  fill_in :name, :with => @user.name
  fill_in :password, :with => @user.password
  fill_in "Confirmation", :with => @user.password_confirmation
  click_button
  visit signin_path
  fill_in :email, :with => @user.email
  fill_in :password, :with => @user.password
  click_button

请注意,在测试运行后,您还必须添加以下内容以清除数据库

after(:each) do
User.find_by_email(@user.email).destroy
end

答案 1 :(得分:2)

这不简单吗?你有“登录”,但没有登出路径:)意思是,也许你应该添加

<li><a href="/signout">Sign Out</a></li>

到你的观点。

答案 2 :(得分:0)

当您通过浏览器自行运行页面时,页面是否按预期工作?也就是说,当您登录时,您会收到“退出”链接吗?

另请参阅:config.cache_classes = false messing up rspec tests?

答案 3 :(得分:0)

看起来测试没有正确签署用户。您可以将代码与completed sample app进行比较,看看是否可以帮助您解决问题。

答案 4 :(得分:0)

我遇到了同样的问题,我已经在日志中检查发生了什么。在SessionsHelper&gt;&gt; sign_in中,我可以看到正确设置了@current_user。稍后,当我们显示用户页面时,它会调用SessionsHelper&gt;&gt; signed_in?但现在@current_user为零,所以我没有显示'已注销'和'个人资料'链接,其中两个测试失败。

似乎正在发生的事情是,当我们登录时,我们在SessionsController的实例中这样做,它调用包含模块中的sign_in方法,该模块又在SessionsController的实例中设置@current_user / em>的。然后它重定向到用户,它将控制传递给UsersController,以及_header.html.erb中调用signed_in的代码?在UsersController的上下文中执行。但是,这个控制器有自己的@current_user变量副本,不受在SessionsController中运行sign_in的影响,所以返回nil。

答案 5 :(得分:0)

在我的案例中找到它,可能值得为你检查。我从来没有真正正确登录,因为在User.rb self.authenticate_with_salt我的第一行是

user = find_by_id(:id)

而不是

user = find_by_id(id)

通过照顾测试通过,我得到了注销等链接。

答案 6 :(得分:0)

同样的事情发生在我身上,正如Alun ap Rhisiart所发生的那样

我的问题是这个街区的第二行...

def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  self.current_user = user
  logger.debug "sign_in(user) - #{self.current_user}"
end

...我不小心把[user.id],[user.salt]

答案 7 :(得分:0)

执行教程的第9章我遇到了同样的问题。原因在于输入代码时我自己的不准确。

我发现(通过操纵_header.html.erb)signed_in?中定义的app/helpers/session_helper.rb方法工作不正确,所有这些都是由于额外的@。

我有这个(使用实例变量):

def signed_in?
    ! @current_user.nil?
end

但应该使用方法current_user代替:

def signed_in?
    ! current_user.nil?
end