因此,除了好奇心外,我没有其他需要知道的很好的理由-最好的理由-但我不确定这里发生了什么。
背景:我正在研究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'和''只是响应的同义词吗?只要我的测试通过,这有关系吗?
默认情况下,主题将引用该类,即MessagesController。
在上一个测试示例中未定义主题,将主题隐式设置为MessagesController。
从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