标签: rspec-rails

Rails 3教程第11章"验证失败:已经收到电子邮件"错误

我的麻烦出现在Ruby的第11章on Rails的教程在这里.

我看到这个rspec错误:

Failure/Error: :user => Factory(:user, :email => Factory.next(:email)))
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken
Run Code Online (Sandbox Code Playgroud)

先在user_spec.rb那里micropost_spec.rb.这真是令人费解.我认为每次autotest运行rspec时,工厂语句都在一个新的测试数据库中生成一个用户.我用git检查了主分支中的源文件并再次尝试,但看到了同样的错误.因此我怀疑它与db内容有关,而不是代码.

所以,我做了以下事情:

restarted "rails s"  
restarted autotest  
rake db:reset  
rake db:migrate  
rake db:test:prepare  
rake db:populate  
Run Code Online (Sandbox Code Playgroud)

......一切都变绿了.rspec测试通过了.

可能有一个更"重要"的解决方案,但我很激动这个工作.希望它可以帮助别人.我只能得出结论,我的测试/开发以某种方式向db添加了一些意想不到的东西.我想上面的步骤是在第11章结尾附近让自己成为新数据库的好方法.

有没有更直接的方法来解决这个问题?错误是否表明我在没有意识到的情况下解决了其他问题?我认为运行rspec并不能保证每次都有新的测试数据库.这是一个错误的假设吗?

rspec ruby-on-rails rspec-rails ruby-on-rails-3 railstutorial.org

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

在Rails 3.1控制器测试中模拟文件上传

我的控制器访问tempfile上传文件的属性并将其传递给另一个模拟组件.我的测试代码有

  @file = mock(Object)
  @file.stub_chain(:tempfile, :path).and_return('thefile.zip')
  # ...
  post :create, :file => @file
Run Code Online (Sandbox Code Playgroud)

和控制器代码调用params[:file].tempfile.path.

从Rails 3.0升级到3.1后,上面的行开始失败了

undefined method `tempfile' for "#[RSpec::Mocks::Mock:0x2b0d9a0 @name=Object]":String
Run Code Online (Sandbox Code Playgroud)

也就是说,Rails 3.1 params[:file]自动转换为字符串.

通过浏览器手动测试时,代码可以正常工作.我试图使用fixture_file_upload,参数成为一个File对象,但它没有tempfile方法.

那么如何将任意模拟对象作为参数传递给Rails 3.1中的动作?

file-upload mocking rspec-rails ruby-on-rails-3.1

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

Rails rspec和omniauth(集成测试)

我的Rails 3.2应用程序使用OmniAuth和Devise来登录Twitter.身份验证系统工作正常.我想在rspec中编写一个集成测试,以确保一切正常.使用wiki中的信息,我写了以下内容,但我知道我错过了一些东西.

在config/environments中的test.rb下,我有以下几行

OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'}
Run Code Online (Sandbox Code Playgroud)

我的rspec测试看起来像这样:

describe "Authentications" do
  context "without signing into app" do

    it "twitter sign in button should lead to twitter authentication page" do
      visit root_path
      click_link "Sign in with Twitter"
      Authentication.last.uid.should == '123545'
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

身份验证是我的模型的名称,在rails控制台中调用.uid会返回字符串.

运行此测试时出现以下错误:

Failure/Error: Authentication.last.uid.should == '123545'
NoMethodError:
undefined method `uid' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我弄清楚如何使用提供的OmniAuth模拟?关于为什么以及如何工作的解释也将受到赞赏.

integration-testing rspec rspec-rails omniauth ruby-on-rails-3

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

测试速度:ActiveRecord use_transactional_fixtures与DatabaseCleaner.strategy =:transaction

从源(database_cleaner,active_record)判断,看起来它们应该同样快.但有人声称使用database_cleaner的事务策略会降低控制器和模型规范(例如).我没有一个大型测试套件可用于基准测试.任何人有任何见解或比较两者?

ruby benchmarking rspec ruby-on-rails rspec-rails

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

存根中any_number_of_times方法的替代

我已将项目升级到rails 4,但现在我收到一些弃用警告,其中一个是DEPRECATION:不推荐使用any_number_of_times..我收到此警告的代码是

sponsorship = RSpec::Mocks::Mock.new(:sponsorship)

SPONSORSHIP.should_receive(:[]).with('sponsorship').any_number_of_times.and_return(sponsorship)
Run Code Online (Sandbox Code Playgroud)

另一种情况是

sponsorship.should_receive(:[]).with(key).any_number_of_times.and_return(value)
Run Code Online (Sandbox Code Playgroud)

我已经使用存根上面的代码,但它没有正确的存根.你能找到我做错的地方吗?对于我曾经使用过的短笛

SPONSORSHIP.stub(:[]).with('sponsorship').and_return(sponsorship)
Run Code Online (Sandbox Code Playgroud)

mocking stubs rspec2 rspec-rails ruby-on-rails-4

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

访问请求规范中的请求对象

如何在请求规范上执行请求之前设置请求标头?

我正在移动控制器规范,以使用Rails在我的API上请求规范.我坚持的一件事是我无法访问request允许请求的对象.

在我的控制器规格上,我可以访问我创建的方法,该方法对特定用户进行签名:

def sign_in(user)
  token = user.api_keys.first.token
  # note the request object being used in the next line
  request.env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Token.encode_credentials(token)
end
Run Code Online (Sandbox Code Playgroud)

这在控制器规格上工作正常,我可以安全地做到:

before { sign_in(user) }
it { post :endpoint, params }
Run Code Online (Sandbox Code Playgroud)

但是根据请求规范,该request对象不可用.如果我尝试:

before { sign_in(user) }
it { post "/api/endpoint", params }
Run Code Online (Sandbox Code Playgroud)

我接受request了我的助手方法nil.

我知道我能做到:

it { post "/api/endpoint", {"HTTP_AUTHORIZATION" => ... } }
Run Code Online (Sandbox Code Playgroud)

但这在规范中看起来很混乱,特别是与控制器规格相比.

我已ActionDispatch::TestRequest::DEFAULT_ENV按照这个答案的建议尝试使用,但它也没有用(我得到了401).

ruby rspec ruby-on-rails rspec-rails ruby-on-rails-4

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

升级到Rspec 3后,符号与模块的比较失败

我刚从Rspec 2.99升级到Rspec 3,我的一些测试得到以下错误.

Failure/Error: Unable to find matching line from backtrace
ArgumentError:
  comparison of Symbol with Module failed
Run Code Online (Sandbox Code Playgroud)

我有以下控制器测试

require 'spec_helper'

describe PeopleController, type: :controller do
  subject { response }

  describe :index do
    before { get :index }

    it { should_not be_success }
    it { should have_http_status '401' }
  end
end
Run Code Online (Sandbox Code Playgroud)

知道可能导致错误的原因吗?

rspec ruby-on-rails rspec-rails

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

assign在rspec-rails中做了什么?

我正在处理我没有写过的代码,并试图了解RSpec的工作原理.

let(:course) { create :new_course }
before { assign :course, course }
Run Code Online (Sandbox Code Playgroud)

我知道这let会创建一个memoized变量.assign这个例子做了什么?

ruby unit-testing rspec ruby-on-rails rspec-rails

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

在水豚中选择单选按钮的主要方法是什么?

我正在尝试为自由职业者选择单选按钮,代码如下(当我们在浏览器上检查元素时)

<label for="registration_payer_type_business"><input checked="checked" id="registration_payer_type_business" name="registration[payer_type]" type="radio" value="business">
          Company
          </label>

<label for="registration_payer_type_freelancer"><input id="registration_payer_type_freelancer" name="registration[payer_type]" type="radio" value="freelancer">
          Freelancer
          </label>
Run Code Online (Sandbox Code Playgroud)

我试过了

page.choose("registration_payer_type_freelancer")
Run Code Online (Sandbox Code Playgroud)

这不会给出任何错误,但是当在水豚中保存和打开页面时,仍然没有选择对抗自由职业者的广播框.如果人们可以使用xpath给出示例并选择,我将不胜感激.

rspec capybara rspec-rails ruby-on-rails-4

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

图像显着减慢了Rspec请求规范

因此,我的请求规范因两个小图像(每个3k大小)的存在而大大减慢.同一页面有两个更大的图像,一个超过700k,但它没有任何问题.这是代码(苗条,我讨厌,但无论如何):

.row.columns#banner
  = image_tag image_url("banner-tail-left.png"), class: 'banner-tail-left'
  .banner-text WELCOME
  = image_tag image_url("banner-tail-right.png"), class: 'banner-tail-right'
Run Code Online (Sandbox Code Playgroud)

以下是测试速度:

两张图片显示:

Finished in 4.01 seconds
Finished in 3.27 seconds
Finished in 3.55 seconds
Finished in 3.5 seconds
Run Code Online (Sandbox Code Playgroud)

除非Rails.env.test,否则两个图像都隐藏了:

Finished in 1.56 seconds
Finished in 1.38 seconds
Finished in 1.23 seconds
Finished in 1.2 seconds
Run Code Online (Sandbox Code Playgroud)

只有其中一个图像显示,时间是相同的缓慢,就好像它们都显示.如果我用其他图像路径替换两个图像路径,则速度很快.知道可能导致这种情况的原因吗?有没有办法告诉Rspec忽略所有图像?

rspec ruby-on-rails rspec-rails

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