Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails 4-Rspec:count本应更改为1,但更改为0_Ruby On Rails_Ruby_Rspec_Ruby On Rails 4_Factory Bot - Fatal编程技术网

Ruby on rails RubyonRails 4-Rspec:count本应更改为1,但更改为0

Ruby on rails RubyonRails 4-Rspec:count本应更改为1,但更改为0,ruby-on-rails,ruby,rspec,ruby-on-rails-4,factory-bot,Ruby On Rails,Ruby,Rspec,Ruby On Rails 4,Factory Bot,我目前正在开发一个RubyonRails应用程序,对测试还不熟悉。几天前,我开始使用gemsrspec-rails、factory\u-girl\u-rails和faker编写测试 为模型验证编写测试非常容易,但现在我被困在编写控制器测试上。 我使用scaffold命令创建了一个简单的类“Message” 模式: create_table "messages", force: true do |t| t.string "name" t.string "email" t.str

我目前正在开发一个RubyonRails应用程序,对测试还不熟悉。几天前,我开始使用gems
rspec-rails
factory\u-girl\u-rails
faker
编写测试

为模型验证编写测试非常容易,但现在我被困在编写控制器测试上。 我使用scaffold命令创建了一个简单的类“Message”

模式:

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
当我尝试运行以下测试时

规范/控制器/消息\u控制器\u规范.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后期创建 使用有效参数 创建新消息(失败-1)

失败:

1) MessagesController使用有效参数后创建将创建新的 消息 失败/错误:预期{ 计数应更改为1,但更改为0

…通过使用此选项:

spec/factories/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
我一直在寻找答案,但到目前为止,我还没有找到一个适合我的解决方案。我希望任何人都能帮助我

谢谢

这是我的模型:(但即使我删除了所有验证,我也会收到相同的错误消息)

功能:消息参数

def message_params
  params.require(:message).permit(:name, :email, :text)
end

attributes\u用于
方法,该方法返回可用于构建消息实例的属性散列

 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
将调用
messagescoontroller\create
操作,该操作将把记录保存在数据库中

编辑

m.text{Faker::Lorem.paragration}
替换
m.text{Faker::Lorem.paragration}
。 As
语句
返回字符串数组,而模型
消息
中的字段
文本
需要字符串。这将导致错误并无法保存记录

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

您可以显示消息模型吗?应该创建的
消息在哪里?在rspec中(调用
FactoryGirl.create(:message)
或在控制器中(调用
post:create,…
)?这就是我的消息模型的样子:class 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
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