我目前正在开发Ruby on Rails应用程序,而且我刚接触测试。几天前,我开始使用宝石rspec-rails
,factory_girl_rails
和faker
编写测试。
为模型验证编写测试非常简单,但现在我仍然坚持编写控制器测试。 我有一个简单的类" Message",我是使用scaffold命令创建的。
SCHEMA:
create_table "messages", force: true do |t|
t.string "name"
t.string "email"
t.string "text"
t.datetime "created_at"
t.datetime "updated_at" end
当我尝试运行以下测试时..
规格/控制器/ messages_controller_spec.rb:
describe "POST create" do
describe "with valid params" do
it "creates a new Message" do
expect {
post :create, FactoryGirl.create(:message)
}.to change(Message, :count).by(1)
end
end
end
..我收到此错误消息..
MessagesController POST创建 有效的参数 创建一条新消息(FAILED - 1)
故障:
1)MessagesController POST创建有效参数创建一个新的 信息 失败/错误:期望{ count应该已经被改变了1,但被改为0
..使用这个工厂:
规格/工厂/ message.rb:
require "faker"
FactoryGirl.define do
factory :message do |m|
m.name { Faker::Name.name }
m.email { Faker::Internet.email }
m.text { Faker::Lorem.sentences }
end
end
我一直在寻找HOURS的答案 - 但到目前为止,我还没有找到适合我的解决方案。我希望那里的任何人都可以帮助我!
谢谢!
这是我的模型:(但即使我删除了所有验证,我也会得到相同的错误消息)
class Message < ActiveRecord::Base
validates :name, :email, :text,
presence: {
value: :true,
message: "ist ein Pflichtfeld"
}
validates :name, length: { maximum: 50,
too_long: "ist zu lang" }
validates :email, length: { maximum: 50,
too_long: "ist zu lang" }
validates :text, length: { maximum: 10000,
too_long: "ist zu lang" }
end
这是我的创作动作:
def create
@message = Message.new(message_params)
respond_to do |format|
if @message.save
format.html { redirect_to action: 'new' }
format.json { render action: 'show', status: :created, location: @message }
else
format.html { render action: 'new' }
format.json { render json: @message.errors, status: :unprocessable_entity }
end
end
end
功能:message_params
def message_params
params.require(:message).permit(:name, :email, :text)
end
答案 0 :(得分:2)
使用attributes_for
方法返回可用于构建Message实例的属性哈希。
describe "POST create" do
describe "with valid params" do
it "creates a new Message" do
expect {
post :create, FactoryGirl.attributes_for(:message) ## Use attributes_for
}.to change(Message, :count).by(1)
end
end
end
FactoryGirl.create(:message)
实际上会在messages
表中保存记录。
对于控制器测试,您只需传递一个属性哈希值,post :create
将调用MessagesController#create
操作,这样就可以将记录保存在数据库中。
修改强>
将m.text { Faker::Lorem.sentences }
替换为m.text { Faker::Lorem.paragraph }
。
由于sentences
返回字符串数组,而模型text
中的字段message
需要字符串。这将导致错误并且无法保存记录。
require "faker"
FactoryGirl.define do
factory :message do |m|
m.name { Faker::Name.name }
m.email { Faker::Internet.email }
m.text { Faker::Lorem.paragraph } ## Use paragraph instead of sentences
end
end