如何确定rspec控制器测试的主题?

时间:2014-02-25 22:24:58

标签: ruby-on-rails rspec controller tdd rspec-rails

所以除了好奇心之外,我没有充分理由需要了解这一点 - 最好的理由 - 但我不确定这里发生了什么。

背景
我正在阅读RSpec书并更新示例。

在第24章 - Rails控制器上,有一个消息控制器的测试。

## spec/controllers/messages_controller_spec.rb ##

require 'spec_helper'

describe MessagesController do
  describe "POST create" do
    let(:message) { mock_model(Message).as_null_object }

    before do
      Message.stub(:new).and_return(message)
    end

  # Then a bunch of Tests...

    context "when the message fails to save" do
      before do
        message.stub(:save).and_return(false)
        post :create
      end

      it "assigns @message" do
        assigns[:message].should eq(message)
      end

      it "renders the new template" do
        response.should render_template("new")
      end
    end
  end
end

这与消息控制器一致:

## app/controllers/messages_controller.rb ##

class MessagesController < ApplicationController
  def create
    @message = Message.new(params[:message])

    if @message.save
      flash[:notice] = "The message was saved successfully"
      redirect_to action: "index"
    else
      render "new"
    end
  end
end



当我进行测试时:

测试通过响应

it "renders the new template" do
  response.should render_template("new")
end

测试也通过主题

it "renders the new template" do
  subject.should render_template("new")
end

测试也通过页面

it "renders the new template" do
  page.should render_template("new")
end

测试ALSO通过 NOTHING

it "renders the new template" do
 should render_template("new")
end

如果它帮助任何人做出正面或反面,config/routes.rb只有 resources :messages

为什么所有这些测试都通过了?我实际测试的是什么? “页面”,“主题”和“仅仅是响应的同义词”吗? 只要我的测试通过,它是否重要?

2 个答案:

答案 0 :(得分:1)

默认情况下,主题将引用该类,即MessagesController。

在上一个测试示例中未定义主题,将隐式将主题设置为MessagesController。

答案 1 :(得分:0)

从binding.pry中看来,主题是控制器类的实例

[2] pry(#<RSpec::ExampleGroups::MyController::DescribeString::ContextString>)> subject.is_a? Class
=> false
[3] pry(#<RSpec::ExampleGroups::MyController::DescribeString::ContextString>)> subject.is_a? Users::SessionsController
=> true