2014-12-29 32 views
0

我是Rspec测试的新手,所以很抱歉如果我的代码中的问题显然是错误的。我试图测试是否发送短信到我保存的Twilio号码。Rspec控制器发布使用Twilio Ruby创建

这里是我的控制器/ messages_controller.rb

require 'twilio-ruby' 

class MessagesController < AppController 
    include Webhookable 

    skip_before_action :verify_authenticity_token 
    skip_before_action :authenticate_user! 

    def create 
    Message.create!(parent_id: nil, 
       content_type: "sms", 
       content: params['Body'], 
       origin: params['From'].gsub("+1", ""), 
       destination: params['To'].gsub("+1", ""), 
       received_at: Time.now()) 
respond_to do |format| 
    format.all { render :nothing => true, :status => 200 } 
end 
end 

end 

这里是我的规格/控制器/ messages_controller_spec.rb我曾经让!()创建了一堆的创建方法的对象在其回调使用

require 'rails_helper' 

RSpec.describe MessagesController, :type => :controller do 
describe "#create" do 
    let(:message) { build(:message) } 
    let!(:hotel) { create(:hotel) } 
    let!(:group) { create(:group) } 
    let!(:guest) { create(:test_guest) } 
    let!(:user) { create(:user) } 
    let!(:visit) { create(:visit) } 
    let!(:group_user) { create(:group_user) } 

    context "when new text message comes in" do 
     it "saves the message" do 
      post :create, :Body => message.content, :From => message.origin, :To => message.destination 
      expect(Message.last).to be_truthy 
     end 
    end 
end 
end 

这里是失败的消息时,我运行测试

Failures: 

1) MessagesController#create when new text message comes in saves the message 
Failure/Error: let!(:visit) { create(:visit) } 
NoMethodError: 
    undefined method `users' for nil:NilClass 
# ./app/models/hotel.rb:30:in `managers' 
# ./app/models/concerns/visit_message.rb:9:in `create_check_in_messages' 
# ./spec/controllers/messages_controller_spec.rb:10:in `block (3 levels) in <top (required)>' 

从那里我去一个核对型号/ hotel.rb:30

def managers 
groups.first.users.managers.order("created_at ASC") 
end 

不过,我想,因为我用让!(:组){创建(:组)},当我跑这不会是零考试。任何方向或建设性的批评将不胜感激。

回答

0

有一件事我可以看到的是,在其中您创建对象的顺序是不正确的

let(:message) { build(:message) } 
let!(:hotel) { create(:hotel) } 
let!(:group) { create(:group) } 
let!(:user) { create(:user) } 
let!(:group_user) { create(:group_user, :group => group, :user => user) } 
let!(:guest) { create(:test_guest) } 
let!(:visit) { create(:visit) } 

你应该在创建之前创建组,userjoin记录group_user用正确的组和用户访问。

+0

感谢您指出,我理解您的解释。我做了调整,但是,我仍然从上面得到同样的失败。难道是因为我没有正确保存对象,所以当它进入“组”表时什么也没有?或者这是我需要将“经理”方法剔除的情况? –