我有一个旧的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) 有人可以向我解释以下方法之间的区别吗?
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的响应如何工作?谢谢!
我正在研究其他人的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不能更好地完成此操作吗?我错过了一些性能优势吗?便携性问题?或者我只是在挑剔?
我将以下代码放入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)
一切都按预期工作.有人可以告诉我,如果我做错了或者这是一个框架问题.谢谢.
冲突后,我得到消息使用git commit -c xxxxxx.当我这样做时,我得到了另一个窗口,其中有我的提交+作者的解释,但不知道如何从那里继续前进.
我很难获得一个控制器的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) 考虑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)
是否有内置功能已经这样做,或者足够接近它不需要这个扩展?
让我们说我有进步
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了解我的精炼方法?
如何在我的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)
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)