小编zet*_*tic的帖子

将capybara从1.0.1升级到1.1.4会使database_cleaner破坏我的规格

我有一个旧的Rails应用程序升级到版本3.2.11,它有很多使用capybara版本1.0.1编写并使用selenium驱动程序运行的请求规范.使用database_cleaner使用截断策略在每次测试后清理数据库.

我想使用poltergeist而不是selenium并将capybara从1.0.1升级到1.1.4以便能够使用最新版本的poltergeist.只更改capybara gem(及其依赖项)引入了运行我的规范的问题.

在每个规范之后,我一直在清理处理程序中从Postgresql数据库中获得死锁错误.我的spec_helper很基本,看起来像这样:

RSpec.configure do |config|
  config.mock_with :rspec

  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

An error occurred in an after hook
  ActiveRecord::StatementInvalid: PG::Error: ERROR:  deadlock detected
DETAIL:  Process 41747 waits for AccessExclusiveLock on relation 17612 of database 16396; blocked by process 41752.
Process 41752 waits for RowExclusiveLock on relation 17529 of database 16396; blocked by process 41747.
HINT:  See server log for query details.
: …
Run Code Online (Sandbox Code Playgroud)

selenium rspec ruby-on-rails capybara database-cleaner

8
推荐指数
2
解决办法
1380
查看次数

RSpec - lambda用法

有人可以向我解释以下方法之间的区别吗?

it "should create a user" do
    lambda do
        post :create, :user => @attr
    end.should change(User, :count).by(1)
end
Run Code Online (Sandbox Code Playgroud)

这就是目前的方法.这可以通过以下方法实现吗?

it "should create a user" do
    post :create, :user => @attr
    response.should change(User, :count).by(1)
end
Run Code Online (Sandbox Code Playgroud)

这些有效吗?或者第二个不起作用?因为我正在遵循的教程似乎尽可能使用response,但在上述情况下没有这样做.有人可以解释上述两种方法之间的区别,lambda和RSpec的响应如何工作?谢谢!

ruby lambda rspec ruby-on-rails-3

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

LEFT JOIN与多个SELECT语句

我正在研究其他人的PHP代码并一遍又一遍地看到这种模式:

(伪代码)

result = SELECT blah1, blah2, foreign_key FROM foo WHERE key=bar

if foreign_key > 0  
  other_result = SELECT something FROM foo2 WHERE key=foreign_key  
end
Run Code Online (Sandbox Code Playgroud)

如果另一个表中没有相关的行,代码需要分支,但是通过在单个SELECT语句中执行LEFT JOIN不能更好地完成此操作吗?我错过了一些性能优势吗?便携性问题?或者我只是在挑剔?

sql

6
推荐指数
2
解决办法
9882
查看次数

应该是validate_format_of.not_with在框架中有问题(或在我的理解中)

我将以下代码放入RSpec测试中:

it { should validate_format_of(:email).not_with('test@test')}
Run Code Online (Sandbox Code Playgroud)

并设置实际的类:

validates :email, :presence => true, :format => /\b[A-Z0-9._%-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/i
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我得到:

失败:1)用户失败/错误:它{should validate_format_of(:email).not_with('test @ test')}当电子邮件设置为"test @ test"时,预期错误包括"不能为空"错误:["名称不能为空(nil)","电子邮件无效(\"test @ test \")"]#./ spec/model/user_spec.rb:8:in`block(2级)在''

当我做一个通过测试时:

it { should validate_format_of(:email).with('adam@trimediatlantic.com')}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.有人可以告诉我,如果我做错了或者这是一个框架问题.谢谢.

ruby rspec shoulda ruby-on-rails-3

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

在樱桃挑选冲突后保留作者

冲突后,我得到消息使用git commit -c xxxxxx.当我这样做时,我得到了另一个窗口,其中有我的提交+作者的解释,但不知道如何从那里继续前进.

git commit

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

无法使用rspec控制器测试POST创建操作(设计和cancan)

我很难获得一个控制器的rspec测试通过.我想测试POST创建操作是否有效.我使用rails(3.0.3),cancan(1.4.1),devise(1.1.5),rspec(2.3.0)

这个模型很简单

class Account < ActiveRecord::Base
  attr_accessible :name 
end
Run Code Online (Sandbox Code Playgroud)

控制器也是标准配置(直接用于脚手架)

class AccountsController < ApplicationController
  before_filter :authenticate_user!, :except => [:show, :index]
  load_and_authorize_resource
  ...

  def create
    @account = Account.new(params[:account])

    respond_to do |format|
      if @account.save
        format.html { redirect_to(@account, :notice => 'Account was successfully created.') }
        format.xml  { render :xml => @account, :status => :created, :location => @account }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @account.errors, :status => :unprocessable_entity }
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

我想通过的rspec测试是(原谅标题,也许不是最合适的)

 it "should call …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails devise cancan

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

Ruby库函数将Enumerable转换为Hash

考虑Enumerable的这个扩展:

module Enumerable

  def hash_on
    h = {}
    each do |e|
      h[yield(e)] = e
    end
    h
  end

end
Run Code Online (Sandbox Code Playgroud)

它是这样使用的:

people = [
  {:name=>'fred', :age=>32},
  {:name=>'barney', :age=>42},
]
people_hash = people.hash_on { |person| person[:name] }
p people_hash['fred']      # => {:age=>32, :name=>"fred"}
p people_hash['barney']    # => {:age=>42, :name=>"barney"}
Run Code Online (Sandbox Code Playgroud)

是否有内置功能已经这样做,或者足够接近它不需要这个扩展?

ruby hash enumerable

4
推荐指数
2
解决办法
1700
查看次数

在RSpec中使用细化

让我们说我有进步

module RefinedString
  refine String do
    def remove_latin_letters
      #code code code code
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我在课堂上使用它演讲:

class Speech
  using RefinedString
  def initialize(text)
    @content = text.remove_latin_letters
  end
end
Run Code Online (Sandbox Code Playgroud)

我已经为RSpec编写了改进测试,现在我正在测试 Speech class

describe Speech
  let(:text) { "???óyi?g" }

  it 'should call my refinement' do
    expect(text).to receive(:remove_latin_letters)
    Speech.new(text)
  end
end
Run Code Online (Sandbox Code Playgroud)

但我明白了 RSpec::Mocks::MockExpectationError: "???óyi?g" does not implement: remove_latin_letter

我不认为嘲笑它是一个很好的解决方案(但我可能错了!在这里嘲笑解决方案?)

所以我试过了

let(:text) { described_class::String.new("???óyi?g") } 但结果是一样的.

我不想明确调用using RefinedString我的RSpec(它应该自己解决,对吧?)

如何让RSpec了解我的精炼方法?

ruby rspec ruby-on-rails refinements

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

在运行RSpec测试时启动irb以进行调试?

如何在我的rspec测试运行期间启动irb

基本上我希望能够玩各种各样的东西,然后我的rspec测试运行在程序的相应实例上.我能够在程序的常规运行时成功执行此操作,但是当我尝试在rspec测试的运行时期间启动irb时遇到问题.

传统运行时

test.rb

#!/usr/bin/env ruby
require 'irb'

puts 'hello world'
IRB.start
puts 'goodbye world'
Run Code Online (Sandbox Code Playgroud)

运行

$ ./test.rb 
hello world
1.9.3-p194 :001 > puts 'yo'
yo
 => nil 
1.9.3-p194 :002 > exit
goodbye world
Run Code Online (Sandbox Code Playgroud)

rspec运行时

test_spec.rb

require 'spec_helper'
require 'irb'

describe "irb" do
  it "should print 'hello world', launch irb, upon exiting irb print 'goodbye world'" do
    puts 'hello world'
    IRB.start
    puts 'goodbye world'
  end
end
Run Code Online (Sandbox Code Playgroud)

运行

$ rake …
Run Code Online (Sandbox Code Playgroud)

ruby testing rspec irb

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