天道酬勤,学无止境

在 rspec-rails 中测试 .where 查询(Testing .where queries in rspec-rails)

问题

我对 Rails 中的 Rspec 测试很陌生,我正在尝试测试以下内容:

class Event < ApplicationRecord
  def host_details
    query ||= User.where(id: self.user_id)
  end

  def hosting_company
    company = host_details.first.company
  end
end

我有以下规范,但我不确定我对host_details方法的结果应该期待什么。 我正在使用 FactoryGirl。

describe "gets information about the host of an event" do
  before(:each) do
    @event = build(:event)
  end

  context "host_details" do
    it "querys the event data and finds the associated user" do

    end
  end

  context "hosting_company" do
    it "gets the company that is hosting the event" do
      expect(@event.hosting_company).to eq "Attnd"
    end
  end

end

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Testing .where queries in rspec-rails
    I'm quite new to Rspec testing in Rails and I'm trying to test the following: class Event < ApplicationRecord def host_details query ||= User.where(id: self.user_id) end def hosting_company company = host_details.first.company end end I have the following spec but I'm not sure exactly what I'm supposed to be expecting back for the results of the host_details method. I'm using FactoryGirl. describe "gets information about the host of an event" do before(:each) do @event = build(:event) end context "host_details" do it "querys the event data and finds the associated user" do end end context
  • 测试与 rspec-rails 3.0.1 和 shoulda 的关联不起作用(Testing associations with rspec-rails 3.0.1 and shoulda doesn't work)
    问题 目前,使用 rspec-rails (2.14.2),我使用 shoulda (3.5.0) gem 测试模型规范中的关联,如下所示: # app/models/user.rb class User < ActiveRecord::Base belongs_to :school end # spec/models/user_spec.rb describe User do it { should belong_to :school } end 经过一些研究,我试图使与关联相关的断言起作用(它们似乎都失败了)。 错误信息: 1) User Failure/Error: it { is_expected.to belong_to :school } NoMethodError: undefined method `belong_to' for #<RSpec::ExampleGroups::School:0x007f8a4c7a68d0> # ./spec/models/user.rb:4:in `block (2 levels) in <top (required)>' 所以我的问题是: 你能在没有 shoulda gem 的情况下测试关联吗? 根据我所看到的“期望”语法,这似乎是不可能的。 每个人都应该使用 rspec 3.0.1 吗? 有解决方法吗? 回答1 shoulda
  • RSpec 控制器测试 - 空白 response.body(RSpec controller testing - blank response.body)
    问题 在使用 RSpec 测试我的控制器时,我遇到了一个问题 - response.body 调用总是返回一个空字符串。 在浏览器中一切都正确呈现,黄瓜功能测试似乎正确,但 RSpec 每次都失败。 对响应对象的其他期望,例如response.should render_template('index')通过没有任何问题。 你们中有人遇到过这个问题吗? 也许可以通过其他方式获得响应html? 至于版本,Rails 2.1.0,RSpec 1.2.7。 回答1 默认情况下,rspec-rails 会侵入 Rails 以阻止它实际渲染视图模板。 你应该只测试你的动作的行为并过滤你的控制器测试,而不是模板渲染的结果——这就是视图规范的用途。 但是,如果您希望像应用程序通常那样使控制器规范呈现模板,请使用 render_views 指令: describe YourController do render_views ... end 回答2 RSpec 2+:如果您想检查端到端 - 响应正文的 url - 使用请求规范而不是控制器规范。 回答3 当我处理一个类似的问题时(这让我想到了这个问题),我突然想到有不同的方法可以给同一只猫剥皮。 换句话说,您可以检查 flash 的内容,而不是检查正文文本。 response.body.should =~ /Invalid email or
  • rspec-rails 和使用 let 导致变量冲突?(rspec-rails and using let leading to variable conflicts?)
    问题 正在编写一些测试并遇到使用let定义一些变量的问题。 我花了一些时间制作了一个最小的失败示例: require "spec_helper" describe "Some behavior" do let(:attachments_dir) { "some_test_dir" } before :all do attachments_dir # Commenting out this line makes the tests pass end context "nested 1" do let(:api_params) do { message: { to: "recipient1", from: "sender1"} } end before do puts "nested 1 before " + api_params.to_s end it "nested 1 example 1" do api_params[:message][:to].should == "recipient1" end end context "nested 2" do let(:api_params) do { message: { from: "sender2"} } end before do puts "nested 2 before " + api_params.to_s end it
  • 为什么Rspec说“失败/错误:无法从回溯中找到匹配的行”?(Why is Rspec saying “Failure/Error: Unable to find matching line from backtrace”?)
    问题 我在这里关注Rails教程:http://railstutorial.org/chapters/filling-in-the-layout#top 当我运行“ rspec spec /”时,出现了一系列错误,如下所示: 1) LayoutLinks should have a Home page at '/' Failure/Error: Unable to find matching line from backtrace stack level too deep # C:/Ruby19/lib/ruby/1.9.1/forwardable.rb:185 2) LayoutLinks should have a Contact page at '/contact' Failure/Error: Unable to find matching line from backtrace stack level too deep # C:/Ruby19/lib/ruby/1.9.1/forwardable.rb:185 但是,当我在Web浏览器中进入localhost:3000 /和localhost:3000 / contact时,页面在那里,并且正确的标题在那里。 这是我的myrailsroot \ spec \ requests \ layout_links_spec
  • Testing associations with rspec-rails 3.0.1 and shoulda doesn't work
    Currently, with rspec-rails (2.14.2), I test my associations in model specs with the shoulda (3.5.0) gem like so: # app/models/user.rb class User < ActiveRecord::Base belongs_to :school end # spec/models/user_spec.rb describe User do it { should belong_to :school } end After some research, I hit a wall trying to make association-related assertions work (they all seem to fail). Error message: 1) User Failure/Error: it { is_expected.to belong_to :school } NoMethodError: undefined method `belong_to' for #<RSpec::ExampleGroups::School:0x007f8a4c7a68d0> # ./spec/models/user.rb:4:in `block (2 levels
  • Rspec 没有看到我的模型类。 未初始化的常量错误(Rspec doesn't see my model Class. uninitialized constant error)
    问题 我正在为我在 Ruby on Rails 应用程序中的模型编写 Rspec 测试。 我在启动 'rspec spec' 时收到此错误 command: /spec/models/client_spec.rb:4:in `<top (required)>': uninitialized constant Client (NameError) 我使用 Rails 4.0.0 和 Ruby 2.0.0 这是我的 client_spec.rb: require 'spec_helper' describe Client do it 'is invalid without first_name', :focus => true do client = Client.new client.should_not be_valid end end 和 Gemfile: source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.0.0.rc1' # Use sqlite3 as the database for Active Record gem 'sqlite3' # Use SCSS for stylesheets gem
  • 为什么人们在 Gemfile 中对 rspec 进行测试和开发?(Why do people group rspec under test and development in the Gemfile?)
    问题 我通常很清楚 bundler Gemfile 选项,但我不确定为什么 rspec(特别是 rspec-rails)应该同时用于测试和开发。 这是我的测试分组: group :development, :test do gem 'rspec-rails' gem 'faker' end group :test do gem "factory_girl_rails" gem "capybara" gem 'guard-rspec' gem 'rb-fsevent' gem 'growl' end 这看起来好吗? 回答1 我引用官方文档: 将 rspec-rails 添加到 Gemfile 中的 :test 和 :development 组: group :test, :development do gem "rspec-rails", "~> 2.6" end 它需要在 :development 组中才能公开生成器和 rake 任务,而无需键入 RAILS_ENV=test。
  • 我应该使用“rake spec”还是“rspec”(不能让“rake spec”起作用)?(Should I use “rake spec” or “rspec” (can't get “rake spec” to work)?)
    问题 我在 Rails 3.2 上,我正在使用 rspec (2.11.1)。 当我使用“rake spec”运行我的测试套件时,我会失败。 当我用“rspec”运行它时,一切都过去了。 我已经看到其他人提到这个问题,但没有明确的解释正在发生的事情以及最佳实践是什么。 如果我执行“rake spec”或“rake tmp:clear && rake spec”,我的测试就会失败。 如果我执行“rspec”或“rspec spec”或“rake db:test:prepare && rspec”,我的测试就会通过。 我认为唯一的区别是 rake 做了“db:test:prepare”,但是如果我在运行 rspec 之前手动执行此操作,我的测试就会通过,所以这不是全部。 在做了一些阅读之后,我改变了我的 Gemfile。 以前,我按照“The RSpec Book”(p328)进行了设置,其中描述了将 rspec gem 放入“group :development, :test”块中。 阅读了其他一些 SO 帖子后,我删除了“:development”并做了一个包。 现在“rake spec”什么都不做。 “rspec”仍然像以前一样工作。 很困惑... 回答1 尝试运行RAILS_ENV=test rake spec 回答2 这是为我解决的问题。 我也能够运行rake spec
  • 为什么 RSpec 的方法“get”、“post”、“put”、“delete”在 gem(或 Rails 之外)的控制器规范中不起作用?(Why don't RSpec's methods, “get”, “post”, “put”, “delete” work in a controller spec in a gem (or outside Rails)?)
    问题 我对 Rails 或 Rspec 并不陌生,但我对制作 gem 并不陌生。 当我测试我的控制器时,REST 方法“get”、“post”、“put”、“delete”给我一个未定义的方法错误。 您将在下方找到代码,但如果您更喜欢在粘贴中查看它,请单击此处。 谢谢! 这是我的 spec_helper: $LOAD_PATH.unshift(File.dirname(__FILE__)) $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require 'rubygems' require 'active_support' unless defined? ActiveSupport # Need this so that mattr_accessor will work in Subscriber module require 'active_record/acts/subscribable' require 'active_record/acts/subscriber' require 'action_view' require 'action_controller' # Since we'll be testing subscriptions controller #require
  • 如何使用 RSpec 测试 ActionCable 频道?(How can I test ActionCable channels using RSpec?)
    问题 我想知道如何测试 ActionCable 频道。 假设我有以下聊天频道: class ChatChannel < ApplicationCable::Channel def subscribed current_user.increment!(:num_of_chats) stream_from "chat_#{params[:chat_id]}" stream_from "chat_stats_#{params[:chat_id]}" end end subscribed方法更新数据库并定义了两个跨频道广播的流,但细节不是很重要,因为我的问题是一个更一般的问题: 如何设置测试以测试订阅此频道所涉及的逻辑? RSpec 在测试类似控制器操作等类似交互时提供了许多辅助方法和各种实用程序,但我找不到有关 RSpec 和 ActionCable 的任何信息。 回答1 您可能想等待* https://github.com/rails/rails/pull/23211 被合并。 它添加了 ActionCable::TestCase。 一旦合并,期待rspec-rails团队尽其所能:https://github.com/rspec/rspec-rails/issues/1606 * 等待是可选的; 您迫不及待地将自己的工作基于此“正在进行的工作”,然后找到一个现在有效的解决方案。
  • Squeel 请求和 Heroku、Postgres:使用 GROUP BY 和 ORDER 时出错(Squeel request and Heroku, Postgres: Error using GROUP BY and ORDER)
    问题 我正在用 mysql 开发我的应用程序,但我正在使用 Heroku 来部署它并被迫使用 PG。 我对以下语句有疑问: <% current_user_savings = Saving.where{user_id == my{current_user}} %> <% @latest_savings = Saving.where{product_id.not_in(current_user_savings.select{product_id})}.group{product_id} %> 所以它可以在我的计算机上运行,​​但是在部署到 heroku 时,我遇到了以下问题: ActionView::Template::Error (PGError: ERROR: column "savings.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT "savings".* FROM "savings" WHERE "savings"."product_... SELECT "savings".* FROM "savings" WHERE "savings"."product_id" NOT IN (SELECT "savings"."product_id"
  • 无法在Rails 3.2中设置Rspec和Capybara(Unable to setup Rspec & Capybara in Rails 3.2)
    问题 我正在创建用于rspec测试的示例应用程序,并且在Gemfile中执行了以下步骤: gem "rspec-rails", :group => [:test, :development] group :test do gem "factory_girl_rails" gem "capybara" gem "guard-rspec" end 然后执行以下步骤: 捆。 rails g rspec:安装。 mkdir规格/支持规格/型号规格/路由。 在我的spec_helper文件中添加了“ require capybara / rspec” 创建了一个示例测试,如下所示: require 'spec_helper' describe "Users" do describe " List users" do it "List all users" do get users_path page.has_content?('List Users') end end end 但它不起作用,出现以下错误 undefined local variable or method `page' *我怀疑没有正确配置水豚,请让我知道配置水豚的正确方法。 回答1 由于您没有在Gemfile中为Capybara指定版本,因此我假设您的版本>= 2.0 ,这意味着所有使用page测试都应位于spec /
  • 功能规范和视图规范之间有什么区别吗?(Is there any difference between a feature spec and a view spec?)
    问题 我有一个关于水豚这里干燥的问题。 汤姆回答得很好,在他的回答中他提到: 功能测试应该用于测试系统中更大的行为。 Ruby on Rails 中的功能规范和视图规范之间有区别吗? 如果可能的话,请用一些例子解释一下。 谢谢你。 回答1 是的,功能和视图规格完全不同。 第一个是完整的集成测试,第二个是单独测试视图。 功能规范使用无头浏览器从外部测试整个系统,就像用户使用它一样。 如果您使用正确的无头浏览器并打开 Javascript,它也会练习代码、数据库、视图和 Javascript。 与其他类型的 rspec-rails 规范不同,特征规范是使用feature和scenario方法定义的。 功能规范,并且仅是功能规范,使用fill_in所有功能,包括visit 、诸如fill_in和click_button类的方法以及诸如have_text匹配器。 rspec-rails 文档中有很多关于特性规范的例子。 这是一个快速的: feature "Questions" do scenario "User posts a question" do visit "/questions/ask" fill_in "title" with "Is there any difference between a feature spec and a view spec?" fill_in
  • RSpec 模拟对象示例(RSpec Mock Object Example)
    问题 我是模拟对象的新手,我正在尝试学习如何在 RSpec 中使用它们。 有人可以发布一个示例(你好 RSpec Mock 对象世界类型示例),或关于如何使用 RSpec 模拟对象 API 的链接(或任何其他参考)? 回答1 这是我在 rails 应用程序中为控制器测试所做的简单模拟示例: before(:each) do @page = mock_model(Page) @page.stub!(:path) @page.stub!(:find_by_id) @page_type = mock_model(PageType) @page_type.stub!(:name) @page.stub!(:page_type).and_return(@page_type) end 在这种情况下,我正在模拟 Page 和 PageType 模型(对象)以及我调用的一些方法。 这使我能够运行这样的测试: it "should be successful" do Page.should_receive(:find_by_id).and_return(@page) get 'show', :id => 1 response.should be_success end 我知道这个答案更具体,但我希望它对您有所帮助。 编辑 好的,这是一个 hello world 示例... 给定以下脚本(hello
  • rspec测试抛出未初始化的常量Rails(NameError)(rspec testing throws Uninitialized constant Rails (NameError))
    问题 请原谅我在StackOverflow上的任何缺点。 我是Ruby on Rails的新手。 我正在关注Rails教程。 我花了很多不成功的时间咨询其他线程,讨论我在这个问题中提出的相同的名称错误。 我的任何尝试运行rspec测试的方法如下:$ bundle exec rspec spec / models / user_spec.rb引发现在臭名昭著的错误:'':未初始化的常量Rails(NameError) 让我知道是否还有其他信息可以提供给您,以使您的工作更加顺利。 这是我的gemfile: source 'https://rubygems.org' ruby '2.0.0' #ruby-gemset=railstutorial_rails_4_0 gem 'rails', '4.0.0' gem 'bootstrap-sass', '2.3.2.0' gem 'bcrypt-ruby', '3.0.1' gem 'faker', '1.1.2' gem 'will_paginate', '3.0.4' gem 'bootstrap-will_paginate', '0.0.9' group :development, :test do gem 'sqlite3', '1.3.8' gem 'rspec-rails', '2.13.1' # The following
  • 在教程中使用 rspec 测试 ruby​​ on rails 时出错(Error in testing ruby on rails using rspec in tutorial)
    问题 我是 ruby​​ on rails 的新手,我只是在阅读 http://ruby.railstutorial.org/chapters/static-pages#top 正如教程所说,我已经创建了 sample_app 包或项目。 现在在第 3.2.1 节中,我正在测试该应用程序。 首先我从 cmd 运行以下命令 $ rails generate integration_test static_pages 这在 spec/requests 目录中创建了 static_pages_spec.rb。 现在在 spec/requests/static_pages_spec.rb 中添加以下代码 require 'spec_helper' describe "Static pages" do describe "Home page" do it "should have the content 'Sample App'" do visit '/static_pages/home' expect(page).to have_content('Sample App') end end end 在这个阶段,我在 sample_app/spec/spec_helper.rb 文件中添加以下代码 config.include Capybara::DSL 所以我的文件看起来像 # This
  • Rails3、Cucumber、Capybara、文件上传 => 内容错误(EOFError)?(Rails3, Cucumber, Capybara, File upload => bad content body (EOFError)?)
    问题 我很难让一个简单的文件上传测试工作。 我在带有 Cucumber 和 Capybara 的 ruby​​ 1.9.2 上使用 Rails 3.0.0。 看法: <%= form_tag "/upload/create", :multipart => true do %> <label for="file">File to Upload:</label> <%= file_field_tag "file" %> <%= submit_tag "Upload" %> <% end %> 黄瓜步骤: When /^I upload the basic file$/ do visit path_to("upload") path = File.join(::Rails.root, "somefile") attach_file("file", path) click_button("Upload") end 在我的控制器中,我已经注释掉了所有内容,除了: def create file = params[:file] end Gemfile 片段: group :development, :test do # testing with specs gem "ZenTest", ">= 4.3.3" gem "autotest" gem "rspec-rails", ">= 2.0.0
  • 如何从 Rails 中的 RSpec 测试调用应用程序助手方法?(How to call an app helper method from an RSpec test in Rails?)
    问题 标题是不言自明的。 我尝试过的一切都导致了“未定义的方法”。 澄清一下,我不是要测试辅助方法。 我正在尝试在集成测试中使用辅助方法。 回答1 您只需要在测试中包含相关的帮助器模块即可使方法可用: describe "foo" do include ActionView::Helpers it "does something with a helper method" do # use any helper methods here 就这么简单。 回答2 对于迟到这个问题的人,它在 Relish 网站上得到了回答。 require "spec_helper" describe "items/search.html.haml" do before do controller.singleton_class.class_eval do protected def current_user FactoryGirl.build_stubbed(:merchant) end helper_method :current_user end end it "renders the not found message when @items is empty" do render expect( rendered ).to match("Sorry, we can't find any
  • rails 4 - 找不到生成器 rspec:install(rails 4 - Could not find generator rspec:install)
    问题 我正在尝试安装用于 TDD 和 BDD 测试的rspec 框架,以及用于在更改完成的同时运行的连续测试的自动测试 gem。 我一直在关注各种教程,其中一些在堆栈溢出中,另一些在网络中,但在执行时我无法找到解决方案 rails 生成 rspec:install 它给我一个错误'Could not find generator rspec:install' 。 我在这里附上 gem 文件:[更新] source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.0.3' # Use sqlite3 as the database for Active Record gem 'sqlite3' # Use SCSS for stylesheets gem 'sass-rails', '~> 4.0.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # Use CoffeeScript for .js.coffee assets and views gem 'coffee-rails', '~> 4.0.0' # See