每个人都在谈论今天Rails(而不仅仅是Rails)开发世界中的TDD(BDD).很容易找到关于它的大量好的一般信息,有很多工具可以用于此目的,并且有很多(好的)如何使用它们的例子.
现在,我已经在火车上了.我喜欢这个想法(以前从未做过TDD)我决定去找那个(因为在我看来这很容易理解).我阅读了大量的例子并做了一些初步测试.我的问题是这样的:我只是不确定我是否正确行事.正如我所说的那样,网上有很多小例子,但我还没有找到任何关于应用程序的TDD整体工作流程的综合指南.
这是我的问题:
我正在寻找一种方法来加速我的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) 我在我工作的一个项目中使用了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 ,有什么方法可以解决这个问题吗?
我有一个像这样的模块(但更复杂):
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)
问题是如何单独测试该模块?或者以上方式是否足够好.似乎有可能有更好的方法来做到这一点.
如何使用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)
但我找不到类似的东西.我错过了一些明显的东西吗
我正在研究我的第一个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也给了我这个警告: …
我在让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) 我在班级中遇到以下属性的问题。我有一个存在为 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使用我创建的主题?我错过了什么?
我知道RSpec有--profile选项,但我只是将MiniTest/shoulda用于我当前的项目.
例如,如果我should validate_presence_of在我的规范中使用,那只是测试我validate_presence_of在我的模型中有一段代码,那就是测试实现.更重要的是,测试真正的问题并不是那个规范完全没用,"如果我没有填写某个字段,模型是否会成功保存?"