小编bob*_*eno的帖子

如何使用rspec测试ActionMailer deliver_later

尝试使用delayed_job_active_record升级到Rails 4.2.我没有为测试环境设置delayed_job后端,因为工作会立即执行.

我正在尝试使用Rspec测试新的'deliver_later'方法,但我不确定如何.

旧控制器代码:

ServiceMailer.delay.new_user(@user)
Run Code Online (Sandbox Code Playgroud)

新控制器代码:

ServiceMailer.new_user(@user).deliver_later
Run Code Online (Sandbox Code Playgroud)

我用它来测试它是这样的:

expect(ServiceMailer).to receive(:new_user).with(@user).and_return(double("mailer", :deliver => true))
Run Code Online (Sandbox Code Playgroud)

现在我使用它会出错.(Double"mailer"收到意外消息:deliver_later with(no args))

只是

expect(ServiceMailer).to receive(:new_user)
Run Code Online (Sandbox Code Playgroud)

nil的'undefined方法`deliver_later'也失败了:NilClass'

我已经尝试了一些示例,允许您查看作业是否在ActiveJob中使用test_helper排队,但我还没有设法测试正确的作业是否排队.

expect(enqueued_jobs.size).to eq(1)
Run Code Online (Sandbox Code Playgroud)

如果包含test_helper,则会通过,但它不允许我检查它是否是正在发送的正确电子邮件.

我想做的是:

  • 测试正确的电子邮件是否已排队(或在测试环境中立即执行)
  • 使用正确的参数(@user)

有任何想法吗??谢谢

rspec ruby-on-rails actionmailer delayed-job rails-activejob

63
推荐指数
7
解决办法
2万
查看次数

用反斜杠单引号替换单引号

我有一个非常大的字符串需要转义它中的所有单引号,所以我可以将它提供给JavaScript而不会让它失望.我无法控制外部字符串,因此无法更改源数据.

例:

Cote d'Ivoir  -> Cote d\'Ivoir  
Run Code Online (Sandbox Code Playgroud)

(实际的字符串很长,包含很多单引号)

我正在尝试通过使用gsub字符串,但无法让它工作:

a = "Cote d'Ivoir"
a.gsub("'", "\\\'")
Run Code Online (Sandbox Code Playgroud)

但这给了我:

=> "Cote dIvoirIvoir"
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

a.gsub("'", 92.chr + 39.chr)
Run Code Online (Sandbox Code Playgroud)

但得到了相同的结果; 我知道它与正则表达式有关,但我从来没有得到那些.

ruby string

46
推荐指数
2
解决办法
2万
查看次数

FactoryGirl覆盖关联对象的属性

这可能很简单,但我无法在任何地方找到一个例子.

我有两个工厂:

FactoryGirl.define do
  factory :profile do
    user

    title "director"
    bio "I am very good at things"
    linked_in "http://my.linkedin.profile.com"
    website "www.mysite.com"
    city "London"
  end
end

FactoryGirl.define do 
  factory :user do |u|
    u.first_name {Faker::Name.first_name}
    u.last_name {Faker::Name.last_name}

    company 'National Stock Exchange'
    u.email {Faker::Internet.email}
  end
end
Run Code Online (Sandbox Code Playgroud)

我想要做的是在创建配置文件时覆盖一些用户属性:

p = FactoryGirl.create(:profile, user: {email: "test@test.com"})
Run Code Online (Sandbox Code Playgroud)

或类似的东西,但我不能正确的语法.错误:

ActiveRecord::AssociationTypeMismatch: User(#70239688060520) expected, got Hash(#70239631338900)
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过首先创建用户然后将其与配置文件相关联来实现此目的,但我认为必须有更好的方法.

或者这将工作:

p = FactoryGirl.create(:profile, user: FactoryGirl.create(:user, email: "test@test.com"))
Run Code Online (Sandbox Code Playgroud)

但这似乎过于复杂.是否有更简单的方法来覆盖关联的属性?这是什么语法?

ruby rspec associations factory-bot

25
推荐指数
2
解决办法
2万
查看次数

View.stub(Rails)的Rspec 3升级问题

我正在将我的测试升级到Rspec3(多么麻烦),删除所有'应该',但我无法解决如何在我的视图测试中升级'view.stub'.

我正在使用设计

例:

view.stub(:current_user) { nil }

render

expect(rendered).to .... etc
Run Code Online (Sandbox Code Playgroud)

这给了我一个弃用警告:

不推荐使用stubrspec-mocks的旧:should语法而不显式启用语法.使用新:expect语法或显式启用:should.来自....

我无法弄清楚如何升级到新的"改进"语法.谢谢

rspec ruby-on-rails rspec-rails

15
推荐指数
1
解决办法
3994
查看次数

引导警报解雇不起作用,rails 3.2

使用带有Rails 3.2的twitter bootstrap 2.0(资产/样式表中的css文件,现在不使用less或sass)

我在屏幕顶部有一个bootstrap样式的错误或成功警报(基于消息的第一个字是否="错误".我已经将'bootstrap.js'和'bootstrap-alert.js'添加到资产/ javascript文件夹.

这是我布局中的代码:

<% flash.each do |name, msg| %>
  <% if msg[0..4] == "Error" %>
    <div class="alert alert-error fade in">
  <% else %>
    <div class="alert alert-success fade in">
  <% end %>
  <a class="close" data-dismiss="alert" href="#">&times;</a>
  <%= msg %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

在我的assets/javascripts/application.js中,我有:

$(".alert-message").alert()
$(".alert-message").alert('close')
Run Code Online (Sandbox Code Playgroud)

不确定我需要两者吗?尝试使用.alert/.alert-error.

当我点击关闭符号时没有任何反应,我确定我错过了一些非常明显的东西,但我不熟悉使用JS/w Rails,无法解决这个问题.在Chrome JS控制台中,我看到此错误消息,该消息似乎与bootstrap-alert.js data-api有关:

Uncaught TypeError: Object [object Object] has no method 'on'

非常感谢任何提示!

javascript twitter-bootstrap

9
推荐指数
3
解决办法
1万
查看次数

LinkedIn Oauth错误:登录后,"伙伴确实没有在浏览器上正确实施身份验证协议"

我们使用devise和linkedin gem集成了一个带有linkedin身份验证的Rails应用程序.它工作正常并能够使用linkedin注册/登录,但是在登录/注册后按下浏览器上的"返回"时会发生奇怪的事情:

它返回到具有相同请求URL的linkedin,显示的错误是:

合作伙伴没有正确实施身份验证协议.红色的

这看起来很糟糕,我们希望有一个更好的方法来处理这个,但不知道从哪里开始; 任何想法可以触发这个,有什么办法可以阻止它吗?

ruby-on-rails oauth linkedin devise

5
推荐指数
1
解决办法
790
查看次数

rails中的view.stub部分rspec给出'undefined method view_context'

使用Rails 3.2.11

我有几个视图rspec测试,我需要存根'current_user'调用.

我在常规视图测试中成功使用了这个:

require 'spec_helper'

describe "projects/_my_project.html.erb" do

  before(:each) do
    @client = FactoryGirl.create(:user)
    view.stub(:current_user) { @client }  
  end

  describe "new proposals notice" do
    it "does not display new_propsals if in state posted and clicked after last submitted"  do
      @my_project = FactoryGirl.build(:project, status: "posted", last_proposals_click: "2012-02-02 14:01:00", last_proposal_submitted: "2012-02-02 14:00:00")
      render :partial => "/projects/my_project", :locals => { :my_project => @my_project }
      rendered.should_not have_content "You received new proposals"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Current_user由controllers/helpers.rb中的Devise定义(在gem中).我在视图或控制器中使用它作为current_user(作为方法,而不是实例).

问题似乎是在view.stub中的视图在这里为零,是否有另一个对象用于部分?我根本不明白为什么这种方法在常规视图中是完美的而不是局部的.

我明白了:

Failure/Error: view.stub(:current_user) { @client }
 NoMethodError:
   undefined …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails

4
推荐指数
1
解决办法
1509
查看次数

Elasticsearch OS X:无法初始化类org.elasticsearch.common.xcontent.XContentFactory

使用ElasticSearch with Rails.(0.19.1)

重新启动Mac后突然间它不再启动了.不确定我通过自制软件安装了什么(最近更新了Java),并在重新安装相同的问题之后.

当我尝试启动时:

elasticsearch -f -D es.config=/usr/local/Cellar/elasticsearch/0.19.1/config/elasticsearch.yml
Run Code Online (Sandbox Code Playgroud)

我明白了:

[2012-09-13 10:33:38,865][INFO ][node                     ] [Ulysses] {0.19.1}[3944]: initializing ...
[2012-09-13 10:33:38,873][INFO ][plugins                  ] [Ulysses] loaded [], sites []
[2012-09-13 10:33:40,381][ERROR][bootstrap                ] {0.19.1}: Initialization Failed ...
1) NoClassDefFoundError[Could not initialize class org.elasticsearch.common.xcontent.XContentFactory]2) StackOverflowError[null]
Run Code Online (Sandbox Code Playgroud)

找不到这个错误并且现在真的卡住了......任何提示都非常感谢!谢谢

macos homebrew elasticsearch

3
推荐指数
1
解决办法
1824
查看次数

ElasticSearch和轮胎/ Rails:对一个方面使用两个字段

使用Elasticsearch与Rails 3和轮胎宝石.

我有一些方面可以在几个领域工作,但我现在有一个特殊的要求,并不确定它是否可行.我的模型Project上有两个字段,它们都存储相同的值:Country1和Country2

允许用户为项目存储最多两个国家/地区.两者的下拉菜单都是相同的.这两个领域都不需要.

我想要的是一个单独的方面,它"合并"来自Country1和Country2的值,并且可以智能地处理这些方面的点击(即无论是1还是2都会找到它)

这是我到目前为止的模型:(注意Country1/2可以是多个单词)

class Project < ActiveRecord::Base
  mapping do
    indexes :id
    indexes :title, :boost => 100
    indexes :subtitle
    indexes :country1, :type => 'string', :index => 'not_analyzed'
    indexes :country2, :type => 'string', :index => 'not_analyzed'
  end
  def self.search(params)
    tire.search(load: true, page: params[:page], per_page: 10) do
    query do
      boolean do
        must { string params[:query], default_operator: "AND" } if params[:query].present?
        must { term :country1, params[:country] } if params[:country].present?
      end
    end
    sort { by :display_type, "desc" }
    facet "country" do
      terms …
Run Code Online (Sandbox Code Playgroud)

search ruby-on-rails elasticsearch tire

2
推荐指数
1
解决办法
2200
查看次数

或使用Tire/Elastic进行查询

这可能很简单,但我无法解决.我在Project类上有这个轮胎/ elasicsearch查询:

  def self.search(params)
    tire.search(load: true, page: params[:page], per_page: 8) do
      query do
        boolean do
          must { string params[:query], default_operator: "AND" } if params[:query].present?
          must { term :status, "posted" }
          must { term :budget, params[:budget] } if params[:budget].present?
        end
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

我需要状态术语搜索'已发布'或'已关闭'并且无法解决此问题.我试过term:status,["posted","closed"]但是这不会返回结果所以可能正在执行AND.感谢这里正确的轮胎语法.(注意不要在这里寻找jason/elasticsearch字符串)非常感谢!

ruby-on-rails-3 elasticsearch tire

1
推荐指数
1
解决办法
967
查看次数