标签: shoulda

应该从战壕中测试工作流程

每个人都在谈论今天Rails(而不仅仅是Rails)开发世界中的TDD(BDD).很容易找到关于它的大量好的一般信息,有很多工具可以用于此目的,并且有很多(好的)如何使用它们的例子.

现在,我已经在火车上了.我喜欢这个想法(以前从未做过TDD)我决定去找那个(因为在我看来这很容易理解).我阅读了大量的例子并做了一些初步测试.我的问题是这样的:我只是不确定我是否正确行事.正如我所说的那样,网上有很多小例子,但我还没有找到任何关于应用程序的TDD整体工作流程的综合指南.

这是我的问题:

  • 你用Shoulda练习TDD的方式是什么?(在一次迭代中,您通常的工作流程是什么?)
  • 您使用了哪些其他工具(除了Shoulda本身)?
  • 还有其他提示吗?

ruby tdd bdd ruby-on-rails shoulda

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

Shoulda + FactoryGirl:我可以更快地进行测试吗?

我正在寻找一种方法来加速我的Shoulda + FactoryGirl测试.

我试图测试的模型(StudentExam)与其他模型有关联.在创建之前,这些关联对象必须存在StudentExam.出于这个原因,它们是在中创建的setup.

但是,我们的一个模型(School)需要很长时间才能创建.因为setup每一个之前被调用should语句时,整个测试用例需要亿万年来执行-它创建了一个新的@school,@student,@topic@exam每一个应声明执行.

我正在寻找一种创建一次这些对象的方法.是否有类似startupfor before_all方法的东西可以让我创建记录,这些记录会在测试用例的其余部分持续存在?

基本上我之前正在寻找与RSpec 之前完全相同的东西(:全部).我不关心依赖的问题,因为这些测试永远不会修改那些昂贵的对象.

这是一个示例测试用例.为长代码道歉(我也创造了一个要点):

# A StudentExam represents an Exam taken by a Student.
# It records the start/stop time, room number, etc.
class StudentExamTest < ActiveSupport::TestCase

  should_belong_to :student
  should_belong_to :exam

  setup do
    # These objects need to be created before we …
Run Code Online (Sandbox Code Playgroud)

testing ruby-on-rails shoulda factory-bot

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

应该:测试validates_presence_of:on =>:update

我在我工作的一个项目中使用了Shoulda和Test :: Unit.我遇到的问题是我最近改变了这个:

class MyModel < ActiveRecord::Base
  validates_presence_of :attribute_one, :attribute_two
end
Run Code Online (Sandbox Code Playgroud)

对此:

class MyModel < ActiveRecord::Base
  validates_presence_of :attribute_one
  validates_presence_of :attribute_two, :on => :update
end
Run Code Online (Sandbox Code Playgroud)

以前,我的(传递)测试看起来像这样:

class MyModelTest < ActiveSupport::TestCase
  should_validate_presence_of :attribute_one, :attribute_two
end
Run Code Online (Sandbox Code Playgroud)

据我所知,没有参数should_validate_presence_of会导致此测试继续通过上面指定的更改.在测试需求时:attribute_two,没有放弃Shoulda ,有什么方法可以解决这个问题吗?

unit-testing ruby-on-rails shoulda

5
推荐指数
2
解决办法
3818
查看次数

单元测试ActiveRecord模型中包含的模块

我有一个像这样的模块(但更复杂):

module Aliasable 
  def self.included(base)
    base.has_many :aliases, :as => :aliasable
  end
end
Run Code Online (Sandbox Code Playgroud)

我包含在几个模型中.目前我正在进行测试,我将制作另一个模块,我将其包含在测试用例中

module AliasableTest 
  def self.included(base)
    base.class_exec do 
      should have_many(:aliases)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是如何单独测试该模块?或者以上方式是否足够好.似乎有可能有更好的方法来做到这一点.

unit-testing shoulda ruby-on-rails-3

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

应该匹配自定义关系名称的匹配器

如何使用shoulda匹配器测试此ActiveRecord关系?

楷模

class User < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :author, class_name: 'User'
end
Run Code Online (Sandbox Code Playgroud)

测试

describe User do
  it { should have_many(:articles) }
end
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

1) User should have many articles
     Failure/Error: it { should have_many(:articles) }
       Expected User to have a has_many association called articles (Article does not have a user_id foreign key.)
     # ./spec/models/user_spec.rb:4:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

所以它显然希望关系字段user_id因为User类名而被命名.我希望有一些测试方法可以用来覆盖这种期望

it { should have_many(:articles).as(:owner) }
Run Code Online (Sandbox Code Playgroud)

但我找不到类似的东西.我错过了一些明显的东西吗

rspec ruby-on-rails shoulda

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

测试我的Ruby gem:未定义的方法`configure'for Shoulda :: Matchers:Module(NoMethodError)

我正在研究我的第一个Ruby gem,并将黄瓜,rspec和shoulda-matches捆绑在一起进行测试.当我运行rspec时,我收到以下错误:

/app/my_gem/spec/spec_helper.rb:6:in `<top (required)>': undefined method `configure' for Shoulda::Matchers:Module (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

这是我的gemspec:

# my_gem.gemspec
...
Gem::Specification.new do |spec|
  ...
  ...
  spec.add_development_dependency "activemodel"
  spec.add_development_dependency "bundler", "~> 1.8"
  spec.add_development_dependency "cucumber"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec" 
  spec.add_development_dependency "shoulda-matchers"
end
Run Code Online (Sandbox Code Playgroud)

我的spec_helper.rb:

require 'my_gem'
require 'pry'
require 'shoulda/matchers'

Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec

    # with.library :active_record
    with.library :active_model
    # with.library :action_controller
    # Or, choose all of the above:
    # with.library :rails
  end
end
Run Code Online (Sandbox Code Playgroud)

.configure由于某些原因,它发现了Shoulda :: Matchers而不是方法.我shoulda以某种方式要求错误吗?不确定这是否相关,但是rspec也给了我这个警告: …

ruby gem rspec ruby-on-rails shoulda

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

水豚问题:@request必须是ActionDispatch :: Request

我在让Capybara使用Rails时遇到了问题.只测试那个有趣的测试用品.好的,在附加的代码中有几个等价的测试.第一个是使用Rails附带的shoulda-context + Test :: Unit.第二次测试也是用水豚和上下文进行的.

require 'integration_test_helper'

class UsersTest < ActionDispatch::IntegrationTest
  fixtures :all

  context "signup" do

    context "failure" do

      setup do
      @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" }
      end

      should "not make a new user" do
        assert_no_difference 'User.count' do
          post_via_redirect "users", :user =>@attr  # enviem les dades d'un nou usuari via create (POST /users)
          assert_template 'users/new'     # ens retorna a users/new, que significa que no s'ha creat l'usuari
          assert_select "div#error_explanation" # …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails shoulda testunit capybara

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

如何更改 shoulda 匹配器的主题

我在班级中遇到以下属性的问题。我有一个存在为 true 的日期属性,该属性也在数据库级别强制执行:

validates :date, presence: true

除此之外,我需要强制以下两个属性的组合唯一性

validates :name, uniqueness: { scope: :parent_id }
Run Code Online (Sandbox Code Playgroud)

到目前为止......一切都很好,但我想要一个测试唯一性的规范

it { should validate_uniqueness_of(:name).scoped_to(:parent_id) }

但上面这一行的问题是,它会尝试通过使用随机名称和parent_id 值(让日期为nil)来在数据库上插入一条记录。因此,它在数据库上失败。

我已经尝试过进行subject { build(:my_model) }测试,但是 it 行仍在创建它自己的测试,并且没有设置日期属性。

我怎样才能让shoulda使用我创建的主题?我错过了什么?

ruby ruby-on-rails shoulda

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

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

应该匹配的ActiveRecord匹配器是否违反了"测试行为不实施"规则?

例如,如果我should validate_presence_of在我的规范中使用,那只是测试我validate_presence_of在我的模型中有一段代码,那就是测试实现.更重要的是,测试真正的问题并不是那个规范完全没用,"如果我没有填写某个字段,模型是否会成功保存?"

tdd unit-testing ruby-on-rails shoulda rails-activerecord

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