【问题标题】:DRY rspec test with routing带路由的 DRY rspec 测试
【发布时间】:2018-10-01 17:01:49
【问题描述】:

我花了几个小时试图让我的 rspec 测试工作。结果,我没有得到想要以某种方式优化的真正 DRY 测试。

它们如下所示:

describe ExtApi::BaseController do
  let!(:app)    { create(:api_application) }
  let!(:token)  { app.token }

  controller do
    def resp
      render json: {foo: 'bar'}
    end

    def error
      raise StandardError 'baz'
    end
  end

  describe '#authenticate' do
    context 'when is successfull' do
      it 'renders bar' do
        routes.draw { get '/foo'  => 'ext_api/base#resp' }
        get :resp,  access_token: token
        expect ...
      end
    end

    context 'when token is invalid' do
      before do
        app.destroy
      end

      it 'renders error' do
        routes.draw { get '/foo'  => 'ext_api/base#resp' }
        get :resp, access_token: token
        expect ...
      end

      it do
        routes.draw { get '/foo'  => 'ext_api/base#resp' }
        get :resp, access_token: token
        is_expected.to respond_with 401
      end
    end

    context 'when token is not presented' do
      it 'renders error' do
        routes.draw { get '/foo'  => 'ext_api/base#resp' }
        get :resp
        expect ...
      end

      it do
        routes.draw { get '/foo'  => 'ext_api/base#resp' }
        get :resp
        is_expected.to respond_with 401
      end
    end
  end

我必须在每个it 块中重复routes.draw(而不是在before),否则,它会破坏所有路由,并且在这些之后运行的所有测试中,我得到RoutingError

那么,我想知道有没有比我做得更好的方法?

(我使用rails 4.2rspec 3.4

【问题讨论】:

    标签: ruby-on-rails-4 rspec routing rspec-rails


    【解决方案1】:

    如果您将每个控制器测试拆分为不同的块,您可以这样做。

    RSpec.describe ExtApi::BaseController, type: :controller do
      describe "GET resp" do
        it 'renders bar' do
          get :resp,  access_token: token
          # expect ...
        end
      end
    end
    

    参考:https://relishapp.com/rspec/rspec-rails/docs/controller-specs

    【讨论】:

    • 我看不出这与我现在拥有的有什么不同
    • 你不必写routes.draw { get '/foo' => 'ext_api/base#resp' },因为如果它是控制器规范,Rspec 会处理它。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2014-08-02
    • 1970-01-01
    • 2011-08-21
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多