我正在学习Rails以及如何使用RSpec进行测试.我需要帮助完成PUT更新操作的RSpec控制器测试.控制器指示嵌套资源.嵌套路由和相关程序代码在Web浏览器中按预期工作.我只需要帮助为PUT更新操作编写RSpec测试.我已经通过了控制器执行的其他操作的测试.
我知道路径以及父和子id必须传递给put方法,但我对以下内容感到困惑:(1)如何使用FactoryGirl对象正确设置PUT更新测试,以及(2)正确RSpec语法将路径和ID传递给PUT方法.
耙路线的相关路线:
PATCH /members/:member_id/cardio_exercises/:id(.:format) cardio_exercises#update
PUT /members/:member_id/cardio_exercises/:id(.:format) cardio_exercises#update
Run Code Online (Sandbox Code Playgroud)
routes.rb包含:resources:成员执行资源:cardio_exercises结束
members.rb包含:has_many:cardio_exercises,:dependent =>:destroy
cardio_exercises.rb包含:belongs_to:member
相关工厂:
FactoryGirl.define do
factory :cardio_exercise do
title "My cardio exercise"
duration 30
calories_burned 300
date "2014-11-15"
association :member
end
end
FactoryGirl.define do
factory :member do
first_name {Faker::Name.first_name}
last_name {Faker::Name.last_name}
age 21
height 75
weight 195
goal "fffff" * 5
start_date "2014-11-15"
end
end
Run Code Online (Sandbox Code Playgroud)
cardio_exercises_controller.rb
class CardioExercisesController < ApplicationController
# :get_member is defined in the private method at the bottom of this file,
# and takes the member_id …Run Code Online (Sandbox Code Playgroud) 我需要帮助编写自定义验证以防止 Rails 4 应用程序中的重叠约会。我正在编写这个应用程序来自学 Ruby 和 Rails。在研究这个问题时,我发现了一个名为 ValidatesOverlap 的 gem,但我想编写自己的验证器以供学习。
我的约会模型有一个日期时间数据类型的“appointment_at”列和时间数据类型的“持续时间”列。Appointment 模型与 Member 和 Trainer 模型具有“has_many :through”关联。约会:
belongs_to :member
belongs_to :trainer
Run Code Online (Sandbox Code Playgroud)
约会模型中的现有验证包括:
validates :member, uniqueness: {scope: :appointment_at, message: "is booked already"}
validates :trainer, uniqueness: {scope: :appointment_at, message: "is booked already"}
Run Code Online (Sandbox Code Playgroud)
自定义验证器需要防止成员或培训师安排重叠约会。现在,我可以防止将“重复约会”保存到数据库中,但无法阻止“重叠”约会。例如,如果 trainer_1 与 member_1 预约了 1 小时的约会(从早上 7:00 开始),我的模型验证会阻止 member_2 与 trainer_1 预约早上 7:00 的约会。但是,我目前没有办法阻止 member_2 在早上 7:01 安排与 trainer_1 的会话!我正在处理两个属性:“appointment_at”,它是开始时间,“持续时间”,它是约会的总时间。如果我可以轻松地从“appointment_at”和“
我很感激关于如何解决重叠约会问题的任何想法或建议(不使用 gem)。提前谢谢了!
我正在使用Rails(4.2.6),Ruby(2.2.4),Devise(4.1.1),Capybara(2.7.1),Capybara-email(2.5.0),Email_spec(2.1.0),Rspec( 3.4.0)和Postgres(0.18.4)
在将应用程序从Rails 4.1.15升级到4.2.6后,一些身份验证和注册测试失败。升级之前,所有测试均已正确通过。该代码在开发环境中按预期工作(例如,确认电子邮件已发送并在Rails服务器终端中可见)。未送达电子邮件的问题仅在测试环境中发生。
这是失败的rspec ./spec/features/users/authentification_spec.rb:56:
#Sign up User
visit "/"
click_link "Sign up"
find(:css, "#user_email").set("tester9@example.com")
find(:css, "#user_password").set("password900")
find(:css, "#user_password_confirmation").set("password900")
expect {
click_button "Sign up"
}.to change{ ActionMailer::Base.deliveries.size}.by(1)
Run Code Online (Sandbox Code Playgroud)
当用户填写完表格并单击“注册”按钮后,页面将重定向到“关于”页面,并按预期方式出现以下即时消息:“带有确认链接的消息已发送到您的电子邮件地址。请请点击链接激活您的帐户。”
使用save_and_open_page,我确认了上述行为。但是,该规范失败,并出现以下错误:
Failure/Error:
expect {
click_button "Sign up"
}.to change{ ActionMailer::Base.deliveries.size}.by(1)
expected result to have changed by 1, but was changed by 0
# ./spec/features/users/authentification_spec.rb:56:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
该错误表明ActionMailer :: Base.deliveries数组中没有消息对象。Pry的结果确认ActionMailer :: Base.deliveries数组确实为空:
[1] pry(main)> mail = ActionMailer::Base.deliveries
=> []
Run Code Online (Sandbox Code Playgroud)
这是运行规范时的测试日志:
Started POST "/users" for 127.0.0.1 at 2016-06-09 16:16:25 …Run Code Online (Sandbox Code Playgroud) 在我的Rails 4.2.6/Ruby 2.2.4应用程序中,我有一个生成字符串的db查询方法; 例如:
"Chest - pectoralis, Quads - quadriceps, Hamstrings - biceps femoris"
Run Code Online (Sandbox Code Playgroud)
但是,我想要的结果是:
"Chest, Quads, Hamstrings"
Run Code Online (Sandbox Code Playgroud)
该域跟踪21个肌肉群,这意味着生成的字符串可以有许多不同的组合.但是,字符串将始终具有相同的模式,即:"普通肌肉名称 - 技术肌肉名称".
使用条件逻辑,我可以通过将"string"参数传递给gsub方法来获得我想要的结果,如下所示:
if @muscle_group_ids == [1, 13, 14]
@muscle_group_names = MuscleGroup.where(id: @muscle_group_ids).map { |n| n[:name]
}.join(', ').gsub!("Chest - pectoralis", "Chest").gsub!("Quads - quadriceps", "Quads").gsub!("Hamstrings - biceps femoris", "Hamstrings")
end
=> "Chest, Quads, Hamstrings"
Run Code Online (Sandbox Code Playgroud)
这种方法不可行; 这是乏味而脆弱的.必须有更好的方法从生成的字符串中删除破折号和技术名称.我对如何最好地完成这件事感到困惑.是否可以编写正则表达式来实现所需的结果,以及如何?有没有更简单,更好,更清洁的方法来实现我想要做的事情?谢谢!