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

问题描述 投票:2回答:2

因此,除了好奇心外,我没有其他需要知道的很好的理由-最好的理由-但我不确定这里发生了什么。

背景:我正在研究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

当我运行测试时:测试通过response通过。

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

测试也通过主题通过。

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

测试也通过page

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

测试也以NOTHING通过

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

[如果它可以帮助任何人对此做出正面或反面,则config/routes.rb仅具有 resources :messages 为什么所有这些测试都通过?我实际上在测试什么? 'page','subject'和''只是响应的同义词吗?只要我的测试通过,这有关系吗?

ruby-on-rails rspec controller tdd rspec-rails
2个回答
1
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.