标签: shoulda

Rails:shoulda-matchersbelong_to 可选测试

我有一个模型

class Certificate < ApplicationRecord
  notification_object
  belongs_to :user
  belongs_to :share_class, optional: true
  belongs_to :round, optional: true
  belongs_to :company, optional: true
  has_many :approvals, as: :votable
end
Run Code Online (Sandbox Code Playgroud)

这个模型的规格看起来像这样

需要'rails_helper'

RSpec.describe Certificate, type: :model do
  it { should belong_to(:user) } 
  it { should belong_to(:share_class).optional } 
  it { should belong_to(:round).optional } 
  it { should belong_to(:company).optional } 
  it { should have_many(:approvals) } 
end
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个规范时,我得到了这个错误

1) 证书应属于 share_class 可选:true

     Failure/Error: it { should belong_to(:share_class).optional }
       Expected Certificate to have a belongs_to association called share_class (the association …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails shoulda rspec-rails

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

rspec和shoulda - 补充还是替代?

我已经使用了一段时间了,我已经阅读并使用了rspec.我还没有深入比较和对比.但在我看来,两者之间存在一些重叠,但它们不是1-1的替代品.

我正在考虑使用rspec在我的rails系统中编写一些单元测试,而不是替换用shoulda编写的所有现有测试.就像一种获得感觉的方式.

这是一个好主意吗?我可以逐渐从一个移动到另一个,还是我在寻找麻烦?

我应该考虑一个明显的优势吗?

谢谢!

ruby rspec ruby-on-rails shoulda

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

没有这样的文件加载 - rspec/matchers - rspec-rails,shoulda,黄瓜,工厂女孩,Rails2.3.10

我继承了一个旧的Rails2.3应用程序.这是非常复杂的,并且(震惊,恐怖)没有任何测试.我习惯了rspec和黄瓜,所以我想我会开始为最终(长期)升级到Rails 3定义规格和功能.如果我确切地知道什么会失败,那么升级会更容易.

无论如何,我发现很难在互联网上找到如何在rails 2.3环境中设置rspec,黄瓜,工厂女孩和shoulda的资源.我的包如下:

source "http://rubygems.org"

# Production gems
gem "rails",    "2.3.10"
gem "nokogiri", "1.4.4"
gem "mysql",    "~> 2.8.1"

group :development do
  # bundler requires these gems in development
  gem 'rspec',          '1.3.2'
  gem 'rspec-core',     '2.5.2'
  gem 'rspec-rails',    '1.3.4'
end

group :test do
  # bundler requires these gems while running tests
  gem 'cucumber-rails', '0.4.1'
  gem 'factory_girl'
  gem 'shoulda',        '2.11.3'
  gem 'shoulda-matchers'
end
Run Code Online (Sandbox Code Playgroud)

当我去跑步

bundle exec rspec spec, 
Run Code Online (Sandbox Code Playgroud)

我从shoulda获得以下stacktrace:

/Users/sys/src/proj/rails/ruby/1.8/gems/shoulda-2.11.3/lib/shoulda/integrations/rspec2.rb:8: no such file to load -- rspec/matchers (MissingSourceFile)
    from /Users/sys/src/proj/vendor/rails/activesupport/lib/active_support/dependencies.rb:184:in `require'
    from …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails shoulda cucumber factory-bot

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

如何在rails中测试rspec shoulda进行自定义验证?

我的模型中有一个私有方法,如下所示:

  validate :record_uniq

  private
  def record_uniq
    if record_already_exists?
      errors.add(:base, "already exists")
    end
  end

  def record_already_exists?
    question_id = measure.question_id
    self.class.joins(:measure).
    where(measures: {question_id: ques_id}).
    where(package_id: pack_id).
    exists?
  end
Run Code Online (Sandbox Code Playgroud)

这种方法更像是uniqueness防范重复记录的范围.我想知道如何validate :record_uniq使用shoulda或编写测试 rspec

我试过的例子:

describe Foo do
  before do
    @bar = Foo.new(enr_rds_measure_id: 1, enr_rds_package_id: 2)
  end

  subject { @bar }

  it { should validate_uniqueness_of(:record_uniq) }
end
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails shoulda rspec-rails ruby-on-rails-3

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

使用shoulda-matchers检查枚举值时出错

在我的device模型中,我有

enum device_type: { ios: 1 , android: 2 }
validates :device_type, presence: true, inclusion: { in: device_types.keys }
Run Code Online (Sandbox Code Playgroud)

在我看来device_spec.rb,我为此写了一些测试

describe 'validations' do
  subject { FactoryGirl.build(:device) }

  it { is_expected.to allow_values('ios', 'android').for(:device_type) }
  it { is_expected.to validate_inclusion_of(:device_type).in_array(%w(ios android)) }
  it { is_expected.not_to allow_value('windows').for(:device_type) }
end
Run Code Online (Sandbox Code Playgroud)

当我运行rspec时,测试allow_values('ios', 'android')通过,但其余两个都失败了.

1)设备应确保在["ios","android"]中包含device_type

失败/错误:它{is_expected.to validate_inclusion_of(:device_type).in_array(%w(ios android))}

 ArgumentError:
   '123456789' is not a valid device_type
Run Code Online (Sandbox Code Playgroud)

2)设备不应允许将device_type设置为"windows"

失败/错误:{is_expected.not_to allow_value('windows').for(:device_type)}

 ArgumentError:
   'windows' is not a valid device_type
Run Code Online (Sandbox Code Playgroud)

"它不是有效的device_type"是正确的,但为什么这些测试失败了?

rspec ruby-on-rails shoulda

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

关于Rails的BDD - 社区是否更接近于Shoulda或RSpec?

对于一个新的应用程序,我想开始涉足BDD,我试图在使用RSpec或Thoughtbot的Shoulda之间做出决定.我喜欢Shoulda使用的宏,以及它似乎没有重新发明Ruby/Rails测试的方式,而只是提供了一个附加组件.另一方面,宏似乎有点太"神奇",而不是明确你正在测试的东西(但是我知道,从涉及写一打很烦人"应该是无效的,没有xxx"两行上一个模型).说实话,我发现编写模型的规格/测试很简单,而且几乎非常容易,但我觉得为控制器编写它们是非常困难的,因为我不确定我应该测试什么或者如何编写它.

因为我认为它们给你错误的假设(因为你可以告诉它认为它有你需要的任何数据或者假装方法X被调用)我不知道嘲弄和抄写的主题我知道RSpec重使用它们.我喜欢RSPec生成的文档,但我正在创建一个销售应用程序,而不是给客户端,因此漂亮的文档并没有那么有用.我喜欢Cucumber,但它似乎有点矫枉过正(是的,我知道它可以和Shoulda一起使用).

在这一点上,Rails社区支持RSpec或Shoulda?

bdd rspec ruby-on-rails shoulda

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

使用shoulda(但不是rspec)测试Rails项目中作用域的唯一性

我有一个用户类,其中包含一个唯一但限定为租户的电子邮件:

class User < ActiveRecord::Base
  validates :email, :uniqueness => {:scope => :tenant_id, :allow_blank => true}
  #...
end
Run Code Online (Sandbox Code Playgroud)

我正试图用以下方法测试它:

class UserTest < ActiveSupport::TestCase
  context "a user" do
    setup { @user = create :user }
    subject { @user }

    should validate_uniqueness_of(:email).scoped_to(:tenant_id)
  end
end
Run Code Online (Sandbox Code Playgroud)

但测试失败并显示以下消息:

当电子邮件设置为"joseph.allen_1@example.com"时,预期错误包括"已经采取",出现错误:["已经收到电子邮件(\"joseph.allen_1@example.com \")", "first_name不能为空(nil)","last_name不能为空(nil)"](具有不同的tenant_id值)

这提出了很多问题.为什么错误消息不匹配?似乎因为实际的电子邮件地址包含在错误消息中,但为什么包含它?当我从UI生成错误时,它似乎不包括在内:

在此输入图像描述

此外,最后它说它正在尝试与不同的租户,如果它是真的,它不应该生成任何错误(它不是当我运行应用程序本身),但是,为什么它期待错误?如果它是相同的tenant_id,它应该只期望错误.

这太令人困惑了.有什么想法和/或如何正确测试这个?

testing scope ruby-on-rails unique shoulda

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

黄瓜和蜜饯之间的主要区别是什么?

如果您要选择测试框架,您将如何在黄瓜和shoulda之间做出决定?

这两个框架的区别主要在于什么?

ruby unit-testing shoulda cucumber

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

应该是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
查看次数

有没有一种很好的方法在Rails中使用`:on`参数测试`before_validation`回调?

我有一个before_validation :do_something, :on => :create我的模特.

我想测试一下这种情况,并且不会发生:save.

是否有一种简洁的方法来测试它(使用Rails 3,Mocha和Shoulda),而不执行以下操作:

context 'A new User' do
  # Setup, name test etc
  @user.expects(:do_something)
  @user.valid?
end

context 'An existing User' do
  # Setup, name test etc
  @user.expects(:do_something).never
  @user.valid?
end
Run Code Online (Sandbox Code Playgroud)

在shoulda API中找不到任何东西,这感觉相当不干......

有任何想法吗?谢谢 :)

unit-testing shoulda mocha.js ruby-on-rails-3

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