【问题标题】:Can I have some feedback with rspec when writing controllers specs?在编写控制器规范时,我可以对 rspec 有一些反馈吗?
【发布时间】:2011-06-08 15:26:23
【问题描述】:

我想知道是否可以对下面的控制器规格提供一些反馈。事实上,我在编写规范时是新手,控制器的规范与模型的规范完全不同!所以我想知道我是否可能不会走错方向......

subjects_controller.rb

def show
  @subject = Subject.find(params[:id])

  if @subject.trusted?(current_user)
    @messages = @subject.messages
  else
    @messages = @subject.messages.public
    @messages = @messages + @subject.messages.where(:user_ids => current_user.id)
    @messages.uniq!
  end

  # sort the list
  @messages = @messages.sort_by(&:created_at).reverse

  if !@subject.company.id == current_user.company.id
    redirect_to(subjects_path, :notice => "Invalid subject")
  end
end

subjects_controller_spec.rb

require 'spec_helper'

describe SubjectsController do  
  before(:each) do
    @subject = mock_model(Subject)
  end

  context "for signed users" do
    before(:each) do
      @current_user = sign_in Factory(:user)
    end

    context "GET #show" do
      before(:each) do
        Subject.stub!(:find, @subject).and_return(@subject)
      end

      context "when current_user is trusted" do
        before(:each) do
          messages = []
          company = mock_model(Company)

          @subject.should_receive(:trusted?).and_return(true)
          @subject.should_receive(:messages).and_return(messages)
          @subject.should_receive(:company).and_return(company)
        end

        it "should render success" do
          get :show, :id => @subject
          response.should be_success
        end
      end

      context "when current_user is not trusted" do
        before(:each) do
          messages = []
          company = mock_model(Company)

          @subject.should_receive(:trusted?).and_return(false)
          @subject.should_receive(:messages).and_return(messages)
          messages.should_receive(:public).and_return(messages)
          @subject.should_receive(:messages).and_return(messages)
          messages.should_receive(:where).and_return(messages)
          @subject.should_receive(:company).and_return(company)
        end

        it "should render success" do
          get :show, :id => @subject
          response.should be_success
        end
      end

      context "when subject's company is not equal to current_user's company" do
        # I have no idea of how to implement ==
      end
    end
  end
end

工厂.rb

Factory.define :user do |u|
  u.first_name 'Test User'                          #
  u.username 'Test User'                            #
  u.surname 'TheTest'                               #
  u.email 'foo@foobar.com'                          #
  u.password 'please'                               #
  u.confirmed_at Time.now                           #
end

【问题讨论】:

    标签: ruby-on-rails model rspec rspec2


    【解决方案1】:

    据我所知,您走在正确的道路上。基本思想是在这些测试中将您的控制器代码与模型和视图完全隔离。您似乎正在这样做 - 存根和模拟模型交互。

    【讨论】:

    • 感谢您的回答,请其他人提供更多反馈?
    【解决方案2】:

    根本不要编写 RSpec 控制器规范。改用黄瓜故事。容易得多,而且覆盖范围更广。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      相关资源
      最近更新 更多