为什么这些RSpec示例失败?

时间:2016-05-14 15:32:16

标签: ruby rspec rspec-rails

我是RSpec的新手。这些规格是由脚手架生成的。

我在日志中遇到这些消息错误:

Failures:

  1) ClientsController POST create with invalid params assigns a newly created but unsaved client as @client
     Failure/Error: expect(assigns(:client)).to be_a_new(Client)
       expected #<Client id: 1, name: "", phone: "", email: "", status: nil, created_at: "2016-05-14 14:56:01", updated_at: "2016-05-14 14:56:01"> to be a new Client(id: integer, name: string, phone: string, email: string, status: integer, created_at: datetime, updated_at: datetime)
     # ./spec/controllers/clients_controller_spec.rb:88:in `block (4 levels) in <top (required)>'

  2) ClientsController POST create with invalid params re-renders the 'new' template
     Failure/Error: expect(response).to render_template("new")
       expecting <"new"> but rendering with <[]>
     # ./spec/controllers/clients_controller_spec.rb:93:in `block (4 levels) in <top (required)>'

  3) ClientsController PUT update with invalid params re-renders the 'edit' template
     Failure/Error: expect(response).to render_template("edit")
       expecting <"edit"> but rendering with <[]>
     # ./spec/controllers/clients_controller_spec.rb:139:in `block (4 levels) in <top (required)>'

Finished in 0.28667 seconds (files took 5.4 seconds to load)
16 examples, 3 failures

我的规格如下:

require 'rails_helper'

RSpec.describe ClientsController, :type => :controller do

  let(:valid_attributes) {
    {
      "name"   => "Mark Rodwell",
      "phone"  => '5585985463053',
      "email"  => 'markrodwell@gmail.com',
      "status" => 1
    }
  }

  let(:invalid_attributes) {
    {
      "name"   => "",
      "phone"  => '',
      "email"  => '',
      "status" => nil
    }
  }

  let(:valid_session) {
    {
      "user_type"             => 2,
      "status"                => 1,
      "name"                  => "Cristiano Carvalho",
      "email"                 => 'cristiano.codelab@gmail.com',
      "password"              => '12345678',
      "password_confirmation" => '12345678'
    }
  }

  describe "GET index" do
    it "assigns all clients as @clients" do
      client = Client.create! valid_attributes
      get :index, {}, valid_session
      expect(assigns(:clients)).to eq([client])
    end
  end

  describe "GET show" do
    it "assigns the requested client as @client" do
      client = Client.create! valid_attributes
      get :show, {:id => client.to_param}, valid_session
      expect(assigns(:client)).to eq(client)
    end
  end

  describe "GET new" do
    it "assigns a new client as @client" do
      get :new, {}, valid_session
      expect(assigns(:client)).to be_a_new(Client)
    end
  end

  describe "GET edit" do
    it "assigns the requested client as @client" do
      client = Client.create! valid_attributes
      get :edit, {:id => client.to_param}, valid_session
      expect(assigns(:client)).to eq(client)
    end
  end

  describe "POST create" do
    describe "with valid params" do
      it "creates a new Client" do
        expect {
          post :create, {:client => valid_attributes}, valid_session
        }.to change(Client, :count).by(1)
      end

      it "assigns a newly created client as @client" do
        post :create, {:client => valid_attributes}, valid_session
        expect(assigns(:client)).to be_a(Client)
        expect(assigns(:client)).to be_persisted
      end

      it "redirects to the created client" do
        post :create, {:client => valid_attributes}, valid_session
        expect(response).to redirect_to(Client.last)
      end
    end

    describe "with invalid params" do
      it "assigns a newly created but unsaved client as @client" do
        post :create, {:client => invalid_attributes}, valid_session
        expect(assigns(:client)).to be_a_new(Client)
      end

      it "re-renders the 'new' template" do
        post :create, {:client => invalid_attributes}, valid_session
        expect(response).to render_template("new")
      end
    end
  end

  describe "PUT update" do
    describe "with valid params" do
      let(:new_attributes) {
        {
          "name"   => "Mark James Rodwell",
          "phone"  => '5585985463053',
          "email"  => 'markrodwl@gmail.com',
          "status" => 1
        }
      }

      it "updates the requested client" do
        client = Client.create! valid_attributes
        put :update, {:id => client.to_param, :client => new_attributes}, valid_session
        client.reload
        expect(assigns(:client)).to eq(client)
      end

      it "assigns the requested client as @client" do
        client = Client.create! valid_attributes
        put :update, {:id => client.to_param, :client => valid_attributes}, valid_session
        expect(assigns(:client)).to eq(client)
      end

      it "redirects to the client" do
        client = Client.create! valid_attributes
        put :update, {:id => client.to_param, :client => valid_attributes}, valid_session
        expect(response).to redirect_to(client)
      end
    end

    describe "with invalid params" do
      it "assigns the client as @client" do
        client = Client.create! valid_attributes
        put :update, {:id => client.to_param, :client => invalid_attributes}, valid_session
        expect(assigns(:client)).to eq(client)
      end

      it "re-renders the 'edit' template" do
        client = Client.create! valid_attributes
        put :update, {:id => client.to_param, :client => invalid_attributes}, valid_session
        expect(response).to render_template("edit")
      end
    end
  end

  describe "DELETE destroy" do
    it "destroys the requested client" do
      client = Client.create! valid_attributes
      expect {
        delete :destroy, {:id => client.to_param}, valid_session
      }.to change(Client, :count).by(-1)
    end

    it "redirects to the clients list" do
      client = Client.create! valid_attributes
      delete :destroy, {:id => client.to_param}, valid_session
      expect(response).to redirect_to(clients_url)
    end
  end

end

1 个答案:

答案 0 :(得分:0)

class Client < ActiveRecord::Base
  validates :name, presence: true
  validates :phone,:presence => true, :length => { :minimum => 9, :maximum => 13 }
end

感谢您的建议!现在它工作正常,没有失败!