- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下:
ScheduledSession ------> Applicant <------ ApplicantSignup
signups_controller#create
期间根据 ScheduledSession 上的属性验证申请人注册模型。 class ScheduledSession < ActiveRecord::Base
has_many :applicants, :dependent => :destroy
has_many :applicant_signups, :through => :applicants
#...
end
class ApplicantSignup < ActiveRecord::Base
has_many :applicants, :dependent => :destroy
has_many :scheduled_sessions, :through => :applicants
#...
end
class Applicant < ActiveRecord::Base
belongs_to :scheduled_session
belongs_to :applicant_signup
# TODO: enforce validations for presence
# and uniqueness constraints etc.
#...
end
#create
Action 将有一个类似于
/scheduled_sessions/:id/signups/new
的路径
def new
@session = ScheduledSession.find(params[:scheduled_session_id])
@signup = @session.signups.new
end
def create
@session = ScheduledSession.find(params[:scheduled_session_id])
@session.duration = (@session.end.to_time - @session.start.to_time).to_i
@signup = ApplicantSignup.new(params[:signup].merge(:sessions => [@session]))
if @signup.save
# ...
else
render :new
end
end
@session.duration
上方设置了一个虚拟属性。防止 Session 被认为无效。如果您愿意,真正的“魔法”发生在
@signup = ApplicantSignup.new(params[:signup].merge(:sessions => [@session]))
这现在意味着在模型中我可以从
self.scheduled_sessions
中选择并访问此申请者注册所针对的 ScheduledSession,即使此时此刻,联接表中不存在记录。
def ensure_session_is_upcoming
errors[:base] << "Cannot signup for an expired session" unless self.scheduled_sessions.select { |r| r.upcoming? }.size > 0
end
def ensure_published_session
errors[:base] << "Cannot signup for an unpublished session" if self.scheduled_sessions.any? { |r| r.published == false }
end
def validate_allowed_age
# raise StandardError, self.scheduled_sessions.inspect
if self.scheduled_sessions.select { |r| r.allowed_age == "adults" }.size > 0
errors.add(:dob_year) unless (dob_year.to_i >= Time.now.strftime('%Y').to_i-85 && dob_year.to_i <= Time.now.strftime('%Y').to_i-18)
# elsif ... == "children"
end
end
development
中运行良好并且验证按预期工作 - 但是如何使用 Factory Girl 进行测试?我想要单元测试来保证我已经实现的业务逻辑——当然,这是在事实之后,但仍然是关于 TDD 的一种方式。
raise StandardError, self.scheduled_sessions.inspect
在上面的最后一次验证中 - 这将返回
[]
为
self.scheduled_sessions
这表明我的工厂设置不正确。
it "should be able to signup to a session" do
scheduled_session = Factory.build(:scheduled_session)
applicant_signup = Factory.build(:applicant_signup)
applicant = Factory.create(:applicant, :scheduled_session => scheduled_session, :applicant_signup => applicant_signup)
applicant_signup.should be_valid
end
it "should be able to signup to a session for adults if between 18 and 85 years" do
scheduled_session = Factory.build(:scheduled_session)
applicant_signup = Factory.build(:applicant_signup)
applicant_signup.dob_year = 1983 # 28-years old
applicant = Factory.create(:applicant, :scheduled_session => scheduled_session, :applicant_signup => applicant_signup)
applicant_signup.should have(0).error_on(:dob_year)
end
self.scheduled_sessions
正在返回
[]
只是意味着以上是不对的。
scheduled_session
通过 mock scheduled_sessions
在 applicant_signup
模型。 FactoryGirl.define do
factory :signup do
title "Mr."
first_name "Franklin"
middle_name "Delano"
last_name "Roosevelt"
sequence(:civil_id) {"#{'%012d' % Random.new.rand((10 ** 11)...(10 ** 12))}"}
sequence(:email) {|n| "person#{n}@#{(1..100).to_a.sample}example.com" }
gender "male"
dob_year "1980"
sequence(:phone_number) { |n| "#{'%08d' % Random.new.rand((10 ** 7)...(10 ** 8))}" }
address_line1 "some road"
address_line2 "near a pile of sand"
occupation "code ninja"
work_place "Dharma Initiative"
end
factory :session do
title "Example title"
start DateTime.civil_from_format(:local,2011,12,27,16,0,0)
duration 90
language "Arabic"
slides_language "Arabic & English"
venue "Main Room"
audience "Diabetic Adults"
allowed_age "adults"
allowed_gender "both"
capacity 15
published true
after_build do |session|
# signups will be assigned manually on a per test basis
# session.signups << FactoryGirl.build(:signup, :session => session)
end
end
factory :applicant do
association :session
association :signup
end
#...
end
最佳答案
我之前的假设是正确的,只是有一些小的变化:
I need to consider ignoring Factory Girl for the association aspect at least and attempt to return the scheduled_session by stubbing scheduled_sessions on the applicant_signup model.
it "should be able to applicant_signup to a scheduled_session" do
scheduled_session = Factory(:scheduled_session)
applicant_signup = Factory.build(:applicant_signup)
applicant_signup.stub!(:scheduled_sessions).and_return{[scheduled_session]}
applicant_signup.should be_valid
end
it "should be able to applicant_signup to a scheduled_session for adults if between 18 and 85 years" do
scheduled_session = Factory(:scheduled_session)
applicant_signup = Factory.build(:applicant_signup)
applicant_signup.dob_year = 1983 # 28-years old
applicant_signup.stub!(:scheduled_sessions).and_return{[scheduled_session]}
applicant_signup.should have(0).error_on(:dob_year)
applicant_signup.should be_valid
end
it "should not be able to applicant_signup if the scheduled_session capacity has been met" do
scheduled_session = Factory.build(:scheduled_session, :capacity => 3)
scheduled_session.stub_chain(:applicant_signups, :count).and_return(3)
applicant_signup = Factory.build(:applicant_signup)
applicant_signup.stub!(:scheduled_sessions).and_return{[scheduled_session]}
applicant_signup.should_not be_valid
end
spork
导致虚假报道。
Finished in 2253.64 seconds
32 examples, 0 failures, 3 pending
Done.
关于ruby-on-rails - 通过使用 RSpec 和 Factory Girl 进行模型验证的 has_many TDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100440/
我知道 TDD 有很多优点(其中一些在下面)。我怎么不确定它是如何驱动设计的? 作为文档 在实际代码之前编写测试有助于最大限度地提高测试覆盖率 帮助确定输入值边界 通常当我们开始实现新功能时,我们会对
我们的团队使用 TDD 进行开发,在实现新功能时,有时会在故事结束时所有卡片都变成绿色时出现“集成卡片”,这意味着将已实现的组件放在一起以相互配合。我对这张卡感觉很糟糕,因为这意味着,没有人在现实生活
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
我在浏览StackOverflow时遇到this题。这里作者提到了他/她的调试风格: I am wondering how to do debugging. At present the steps
我对 TDD 很陌生,我想到的第一个问题是我是否应该对每个开发的组件应用单元测试。我之所以这么问是因为我观察到单元测试需要很多时间,尤其是在对需求进行了一些更改时。那么,您能否提出一些类似于 TDD
假设您正在实现包含各种新功能并增加代码库复杂性的用户故事。现有代码已经很好地涵盖了,您刚刚决定了接口(interface)。您开始实现从测试开始的功能。 现在您有相当复杂的基于需求的测试用例,但实现远
我正在使用VS 2012,但这并不是很重要。 重要的是,我正在尝试通过首先编写所有测试然后创建代码来进行一些TDD。 但是,该应用程序将无法编译,因为我的对象或方法都不存在。 现在,在我看来,我应该能
我对单元测试和 TDD“相对较新”。直到最近,我才完成了我的第一个(至少在理论上)代码覆盖率为 100% 的生产应用程序。我在以前的项目中也做过一段时间的单元测试,但不是以真正的 TDD 方式和良好的
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 5年前关闭。 Improve this
我真的很想在我工作的车间内插入 TDD 开发。那里的很多前辈不从事单元测试工作,或者进行了会影响数据库的单元测试。 我很想带来一些好的论据、培训书籍、可能的教练来缓解过渡。 最佳答案 我发现通常很难从
请注意,我还没有在 TDD 上“看到曙光”,也没有真正理解为什么它的主要支持者宣扬了它的所有好处。我并没有否认它 - 我只是有我的保留意见,这可能是出于无知。所以无论如何都要笑下面的问题,只要你能纠正
我工作的所有项目都与一个硬件接口(interface),这通常是软件的主要目的。有什么有效的方法可以将 TDD 应用于与硬件一起工作的代码? 更新:对不起,我的问题没有更清楚。 我使用的硬件是从相机捕
我团队中的一位同事说,某些方法应该同时具有前提条件和后置条件。但重点是代码覆盖率,这些条件不会被调用(未测试),直到实现了无效的实现(仅在单元测试中使用)。让我们看下面的例子。 public inte
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 4年前关闭。 Improve this
我不明白下面的代码如何不遵守TDD FIRST principle。 这些是我关于FIRST原则的说明: Fast: run (subset of) tests quickly (since you'
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
在引用涉及 TDD 的项目/任务的估算时是否有任何指导方针? 例如,与正常开发需要 1 天才能完成的任务相比,TDD 驱动的任务需要多花多少时间?多出 50% 的时间还是多出 70% 的时间?假设开发
总结: 您在 TD 设计与开发中包含和/或交付了哪些模型和图表,为什么? 详细信息: 新的 4 位开发人员项目,在我们逐渐取得进展的商店中,让管理层在 TDD 采用/期望方面从“购买”升级到“行动”。
我的公司想在我们的项目中应用 TDD,我们 5 个月前开始研究 TDD。我们从编写单元到验收测试开始(您可以在 http://uet.vnu.edu.vn/~chauttm/TDD/ 中看到)。然后我
几周前,我开始了我的第一个 TDD 项目。到目前为止,我只读过一本关于它的书。 我主要关心的是:如何为复杂的方法/类编写测试。我写了一个计算二项分布的类。因此,该类的方法将 n、k 和 p 作为输入,
我是一名优秀的程序员,十分优秀!