小编cod*_*red的帖子

RSTP控制器测试PUT更新对嵌套资源的操作

我正在学习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)

rspec ruby-on-rails factory-bot

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

自定义验证器以防止 Rails 4 应用程序中的重叠约会?

我需要帮助编写自定义验证以防止 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)。提前谢谢了!

validation ruby-on-rails

2
推荐指数
1
解决办法
1337
查看次数

ActionMailer无法在测试环境中传递确认电子邮件-Rails 4

我正在使用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)

rspec devise capybara ruby-on-rails-4

2
推荐指数
1
解决办法
1233
查看次数

将正则表达式作为参数写入gsub!方法 - 难倒?

在我的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)

这种方法不可行; 这是乏味而脆弱的.必须有更好的方法从生成的字符串中删除破折号和技术名称.我对如何最好地完成这件事感到困惑.是否可以编写正则表达式来实现所需的结果,以及如何?有没有更简单,更好,更清洁的方法来实现我想要做的事情?谢谢!

ruby regex gsub ruby-on-rails-4

2
推荐指数
1
解决办法
86
查看次数