Tag: rspec

Rails控制器中’env’和’request.env’有什么区别?

我正在使用rspec为我的应用程序编写测试。 为了授权,我在标头中发送token : request.headers[‘token’] = ‘000000099’ get :index 在控制器端,我可以通过request.env[“HTTP_TOKEN”]读取该值,但env[“HTTP_TOKEN”]为空。 它们之间有什么区别,我如何设置env而不是request.env ?

rspec测试,如何在我的情况下获取id?

我的控制器有一个rsepc测试,在我的测试中,我有以下代码片段: … params= {SOME PARAMETERS} post :create, params 上面的代码在我的控制器中测试create方法, create方法创建一个实例对象并将其保存到数据库中。 现在的问题是如何在数据库中获取创建的实例对象的id ? 看来(我不确定)我需要查询测试数据库中的这个对象,如何查询? (PS:我知道有Factory可以用来创建对象实例,但这是一个测试控制器,使用Factory会松开测试控制器的创建方法的目的。所以,请不要建议我使用Factory ) 我想知道如何根据我的代码获取我创建的对象实例的ID? 谢谢:)

Rails 3和update_attribute上的奇怪关系行为

我很难找到测试失败的原因: describe User, “Instance Methods” do describe “leave_group!” do it “should set group_id to nil” do @user = Factory(:user) @group_2 = Factory(:group, :owner => @user) @user.leave_group! @user.reload.group_id.should be_nil # THIS LINE IS FAILING!!! end it “should assign another owner to group, if owner was user” do @user = Factory(:user) @group = Factory(:group, :owner => @user) […]

使用Capybara Webkit 1.3.1测试警报对话框文本

我希望使用Capybara Webkit在警报对话框中测试文本。 我知道accept_js_confirms和reject_js_confirms方法,但我想在执行操作之前评估对话框的内容。 例如,在Selenium中,以下工作: alert = page.driver.browser.switch_to.alert expect(alert.text).to eq t(‘report_periods.edit.delete_confirmation’) alert.accept 我目前正在使用expect(page.driver.confirm_messages).to include t(‘report_periods.edit.delete_confirmation’)来测试同一个对话框的文本,但是,在更新我们的capybara-webkit gem后,我们的测试会输出一个弃用警告: [DEPRECATION] Capybara::Webkit::Driver#confirm_messages is deprecated. Please use Capybara::Session#accept_confirm or Capybara::Session#dismiss_confirm instead. [DEPRECATION] Capybara::Webkit::Driver#confirm_messages is deprecated. Please use Capybara::Session#accept_confirm or Capybara::Session#dismiss_confirm instead. 使用警告中的任何一种方法都不会测试对话框的内容。

如何在Capybara中重用代码

我在Rails的一个function测试中有一堆具有重复结构的代码。 我想通过重复使用结构来干掉我的规格。 有什么建议? 一个例子是: feature “Search page” subject { page } it “should display results” # do something within “#A” do should have_content(“James”) end within “#B” do should have_content(“October 2014”) end # do something else # code with similar structure within “#A” do should have_content(“Amy”) end within “#B” do should have_content(“May 2011”) end end 起初,我尝试在RSpec中定义一个自定义匹配器,但是当我within块within添加时,它似乎不起作用。 […]

即使路由存在,Rspec命名空间路由规范也会失败

我正在使用rspec-rails(2.8.1)和rails 3.1.3 。 我正在尝试为我的Admin :: ZonesController测试路由。 我已经validation了浏览器和运行rake routes 。 我没有使用ActiveRecord(如果重要的话)。 当我运行路由规范时,它告诉我: ActionController::RoutingError: No route matches “/admin/zones/new” 这是测试(spec / routing / admin / zones_routing_spec.rb): require ‘spec_helper’ describe “routing to zones” do it “routes /admin/zones/new to admin/zones#new” do { :get => “/admin/zones/new” }.should route_to( :controller => “admin/zones”, :action => “new” ) end end 这是控制器动作我试图测试的路径(admin / zones #new): […]

为rails中的自引用关联构建工厂

我有一个典型的要求,我必须解决用户对象如下 user.referrer and user.referrers. 基本上,用户可以引用多个人,并且一个人应该由一个特定用户引用。 所以我建立如下关联。 他们工作得很好。 class User “User”, :foreign_key => “referrer_id” belongs_to :referrer, :class_name => “User” end 现在我想在Rspec中测试一下。 我正在使用工厂女孩,所以任何人都帮我建工厂。 我尝试如下,但最终出现错误 factory :user do gender :male name “super test” ….. ….. factory :referrer do end association :referrer end

工厂女孩与枚举和协会

我有一个使用关联和枚举属性的模型。 class ProjectItem < ActiveRecord::Base belongs_to :project enum status: {open: 0, pending: 1, completed: 2} 当我在带有关联的模型的创建操作上运行测试时,我使用build(:model_name).attributes如下所示: it “creates a new ProjectItem” do expect { post :create, document_project_item: build(:project_item).attributes }.to change(ProjectItem, :count).by(1) end 这是失败的,我发现这个问题线程解释了为什么它不起作用 。 根据评论,我能够确定在具有enum属性但没有关联的表上,按预期方式使用attributes_for(:model_name) 。 问题主题似乎没有建议解决方法,但我承认我不明白FactoryGirl方法在幕后所做的100%。 这是工厂: factory :project_item do project name { Faker::Company.bs } description { Faker::Lorem.paragraph } status :open due { Faker::Date.between(2.days.ago, […]

Rspec validates_uniqueness_of测试失败并出现其他validation错误

我在答案模型上有2个范围的唯一性validation,我试图使用Rspec和相应的shoulda匹配器来测试这些。 如下面的test trace所示,唯一性validation消息存在于errors数组中,但是,还存在2个,有时还存在3个其他错误; “body can’t be blank (nil)”, “body is too short (minimum is 10 characters) (nil)”, “user_id can’t be blank (nil)” 。 我不确定它们来自哪里,因为body和user属性是在before块中明确设置的。 如何更正这些额外错误,以便唯一性测试通过? answer.rb validates_uniqueness_of :correct, scope: :question_id, if: :correct?, message: “You can only have 1 correct answer per question” validates_uniqueness_of :user_id, scope: :question_id, message: “Only 1 answer per question per user” /* […]

Rails载波测试 – 如何在测试后删除文件?

我正在使用rspec和capybara测试carrierwave上传function。 我有类似的东西: describe “attachment” do let(:local_path) { “my/file/path” } before do attach_file(‘Attachment file’, local_path) click_button “Save changes” end specify {user.attachment.should_not be_nil} it { should have_link(‘attachment’, href: user.attachment_url) } end 这很有效。 问题是测试后上传的图像仍然在我的public / uploads目录中。 测试完成后如何将其删除? 我试过这样的事情: after do user.remove_attachment! end 但它不起作用。