2012-01-19 118 views
1

我决定写一些请求规格,除了我的黄瓜方案。但是失败了我的第一个例子:Rails请求规范不提出请求

所以在我goalsController这个put方法:

def achieve 
     @goal.update_attribute(:achieved, true) 
     redirect_to :back 
    end 

这是例子:

# -*- coding: utf-8 -*- 
require 'spec_helper' 

describe "Achievements" do 
    before(:all) do 
    @bob = Factory(:user, :email => "[email protected]", :password => "qweqwe", :password_confirmation => "qweqwe", :money => 500) 
    @achieve = Factory(:goal, :user => @bob, :title => "Notebook", :price => 100, :achieved => false) 
    login_user('[email protected]', 'qweqwe') 
    end 
    it 'can not be achieved twice' do 
     visit dashboard_path 
     put achieve_user_goal_path(@bob, @achieve) #Passes it well 
     @achieve.reload #same with or without this line 
     @achieve.achieved.should equal true #Fails 
    end 
end 

所以之后“实现”把请求字段为真。它在我的应用程序中完美工作,并在黄瓜步骤中完成,但不在此rspec示例中。这就像rspec只是忽略了'put'一致。

回答

0

如果我明白这是如何正确工作的,RSpec使用Rails中的Test :: Unit助手。如果从您所描述的内容中读取控制器名称,那么您需要describe AchievementsController,而不仅仅是一些字符串。您不访问一个页面然后发送put,您只需描述控制器并发送put

也就是说,当您使用水豚一体化测试助手时,像putget这样的单元测试助手可能不会做你想做的事情,因为它们将在浏览器驱动程序的上下文之外执行。您应该指示水豚点击所需的链接或按钮(或执行用户执行的任何操作)。

+0

我想测试一切工作正常,如果用户试图再次请求这一点。例如,如果他打开两个相同的页面,并尝试点击两者上的“实现”。 –

+0

我没有从你的问题得到这个;就我所知,测试竞态条件并不是很容易,但如果您不需要同时执行这些请求,只需点击路径并单击按钮两次。 – d11wtq

+0

在下一次访问此路径时不会出现此按钮,因为目标已实现。但是,如果较早的用户打开另一个页面,则它将具有此按钮,并且用户将能够再次点击它。我的代码已经安全的这种行为(我插入不是所有的代码#achieve行动),我只是想要测试与请求规格:) –