代码之家  ›  专栏  ›  技术社区  ›  map7

多个角度请求会在测试中导致错误

  •  0
  • map7  · 技术社区  · 7 年前

    我有一个带有Rails 4.0后端的Angular 1.5应用程序,我遇到了这个问题,在我的测试中,一名工作人员登录3个查询后,会同时发送到后端。在测试中(使用水豚+硒+铬无头),这会导致这些请求在后端出错。在开发中效果很好。

    错误示例;

    NoMethodError at /entities/get_current_entity
    =============================================
    
    > undefined method `fields' for nil:NilClass
    
    app/controllers/application_controller.rb, line 79
    --------------------------------------------------
    
    ``` ruby
       74   
       75     private
       76   
       77     def set_locale
       78       #I18n.locale = params[:locale] if params[:locale].present?
    >  79       if current_staff.nil? or current_staff.locale.nil?
       80         I18n.locale = "en"
       81       else
       82         I18n.locale = current_staff.locale
       83       end
       84     end
    ```
    
    App backtrace
    -------------
    
     - app/controllers/application_controller.rb:79:in `set_locale'
    <Snip>
    

    失败的测试

    require "rails_helper"
    
    RSpec.describe "Login", :type => :feature do
      describe "login with existing staff member" do
        before do 
          create_admin
        end
    
        it "logs in as admin" do
          visit "#/login"
          fill_in "Email", with: "admin@test.com.au"
          fill_in "Password", with: "password"
          click_button "Login"
    
          within "#staff-status" do
            expect(page).to have_text('LOGOUT')    
          end
    
          within("#flash-messages") do 
            expect(page).to have_text('Successful login')
          end
    
          # Check session variables
          within("#selected-entity") do 
            expect(page).to have_text("LOGIN DEFAULT COMPANY")
          end
    
          within("#selected-ledger") do 
            expect(page).to have_text("My Ledger")
          end
    
          within("#selected-division") do 
            expect(page).to have_text("1-General")
          end
        end
      end
    end
    

      $scope.$on('devise:new-session', (event, currentStaff) ->
        # staff logged in by Auth.login({...})
        Auth.currentUser().then((staff) ->
          FirmService.current_entity($rootScope)
          DivisionService.current_division($rootScope)
          LedgerService.current_ledger($rootScope)
    
          $rootScope.current_staff = staff
        , (error) ->
          console.log("fail")
        )
    
        $location.path "/dashboard"
      )
    

    这在整个应用程序中都会发生,但在Rails 3.2上没有发生。自从我升级到Rails 4之后,这种情况才开始发生。

    以下是登录的解决方法;

    Auth.currentUser().then((staff) ->
      FirmService.current_entity($rootScope).then ->
        DivisionService.current_division($rootScope).then ->
          LedgerService.current_ledger($rootScope)
    

    如何让Rails 4在测试模式下处理这样的多个请求?

    我在测试环境中运行了我的服务器,试图手动复制问题,但这样做时它起了作用。所以这一定与测试的速度或水豚本身有关?

    更新:更新的Gems

    更新:错误

    更新:调试

    插入“需要撬”;结合撬开Rails控制器,AngularJS调用最终无法按预期工作。我在AngularJS代码中有三个调用,我预计Rails将三次进入调试行。第一次我用调试行运行它时,它只命中其中一行,第二次它没有命中任何调试行。相反,我在/entities/get\u current\u entity中得到了NoMethodError,在division和ledger中也是这样。

    更新:查看撬吊

    悬挂

    在重新标记set_语言环境内容后,它继续进行,但仍然失败,并处于测试中。日志文件我得到了这些错误;

    Completed 500 Internal Server Error in 4690ms
    Completed 500 Internal Server Error in 4688ms
    Completed 500 Internal Server Error in 4686ms
    
    NoMethodError - undefined method `fields' for nil:NilClass:
    <snip>
    NoMethodError - undefined method `fields' for nil:NilClass:
    <snip>
    NoMethodError - undefined method `collect' for nil:NilClass:
    <snip>
    (1.3ms)  ALTER TABLE "indirect_taxes" DISABLE TRIGGER ALL;ALTER TABLE "ledger_defaults" DISABLE TRIGGER ALL;ALTER TABLE "ledgers" DISABLE TRIGGER ALL;ALTER TABLE "levels" DISABLE TRIGGER ALL;ALTER TABLE "locations" DISABLE TRIGGER ALL;ALTER TABLE "phones" DISABLE TRIGGER ALL;ALTER TABLE "sessions" DISABLE TRIGGER ALL;ALTER TABLE "transactions" DISABLE TRIGGER ALL;ALTER TABLE "versions" DISABLE TRIGGER ALL;ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "staff" DISABLE TRIGGER ALL;ALTER TABLE "tickets" DISABLE TRIGGER ALL;ALTER TABLE "timesheets" DISABLE TRIGGER ALL;ALTER TABLE "websites" DISABLE TRIGGER ALL;ALTER TABLE "customers" DISABLE TRIGGER ALL;ALTER TABLE "costings" DISABLE TRIGGER ALL;ALTER TABLE "disbursements" DISABLE TRIGGER ALL;ALTER TABLE "employees" DISABLE TRIGGER ALL;ALTER TABLE "entities" DISABLE TRIGGER ALL;ALTER TABLE "folios" DISABLE TRIGGER ALL;ALTER TABLE "work_descs" DISABLE TRIGGER ALL;ALTER TABLE "account_groups" DISABLE TRIGGER ALL;ALTER TABLE "accounts" DISABLE TRIGGER ALL;ALTER TABLE "addresses" DISABLE TRIGGER ALL;ALTER TABLE "business_types" DISABLE TRIGGER ALL;ALTER TABLE "charges" DISABLE TRIGGER ALL;ALTER TABLE "comments" DISABLE TRIGGER ALL;ALTER TABLE "invoices" DISABLE TRIGGER ALL;ALTER TABLE "jobs" DISABLE TRIGGER ALL;ALTER TABLE "divisions" DISABLE TRIGGER ALL;ALTER TABLE "emails" DISABLE TRIGGER ALL
       (411.5ms)  TRUNCATE TABLE "public"."indirect_taxes", "public"."ledger_defaults", "public"."ledgers", "public"."levels", "public"."locations", "public"."phones", "public"."sessions", "public"."transactions", "public"."versions", "public"."staff", "public"."tickets", "public"."timesheets", "public"."websites", "public"."customers", "public"."costings", "public"."disbursements", "public"."employees", "public"."entities", "public"."folios", "public"."work_descs", "public"."account_groups", "public"."accounts", "public"."addresses", "public"."business_types", "public"."charges", "public"."comments", "public"."invoices", "public"."jobs", "public"."divisions", "public"."emails" RESTART IDENTITY CASCADE;
       (1.9ms)  ALTER TABLE "indirect_taxes" ENABLE TRIGGER ALL;ALTER TABLE "ledger_defaults" ENABLE TRIGGER ALL;ALTER TABLE "ledgers" ENABLE TRIGGER ALL;ALTER TABLE "levels" ENABLE TRIGGER ALL;ALTER TABLE "locations" ENABLE TRIGGER ALL;ALTER TABLE "phones" ENABLE TRIGGER ALL;ALTER TABLE "sessions" ENABLE TRIGGER ALL;ALTER TABLE "transactions" ENABLE TRIGGER ALL;ALTER TABLE "versions" ENABLE TRIGGER ALL;ALTER TABLE "staff" ENABLE TRIGGER ALL;ALTER TABLE "tickets" ENABLE TRIGGER ALL;ALTER TABLE "timesheets" ENABLE TRIGGER ALL;ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "websites" ENABLE TRIGGER ALL;ALTER TABLE "customers" ENABLE TRIGGER ALL;ALTER TABLE "costings" ENABLE TRIGGER ALL;ALTER TABLE "disbursements" ENABLE TRIGGER ALL;ALTER TABLE "employees" ENABLE TRIGGER ALL;ALTER TABLE "entities" ENABLE TRIGGER ALL;ALTER TABLE "folios" ENABLE TRIGGER ALL;ALTER TABLE "work_descs" ENABLE TRIGGER ALL;ALTER TABLE "account_groups" ENABLE TRIGGER ALL;ALTER TABLE "accounts" ENABLE TRIGGER ALL;ALTER TABLE "addresses" ENABLE TRIGGER ALL;ALTER TABLE "business_types" ENABLE TRIGGER ALL;ALTER TABLE "charges" ENABLE TRIGGER ALL;ALTER TABLE "comments" ENABLE TRIGGER ALL;ALTER TABLE "invoices" ENABLE TRIGGER ALL;ALTER TABLE "jobs" ENABLE TRIGGER ALL;ALTER TABLE "divisions" ENABLE TRIGGER ALL;ALTER TABLE "emails" ENABLE TRIGGER ALL
    

    我认为截断表的最后一点是试图清理混乱的数据库清理器。所以我遇到的这三个服务器错误似乎超时了。为什么数据库/Rails会停止侦听查询?

    当我键入一个简单查询时,pry也将挂起在set\u locale方法中

    Staff.all
    

    我获取了pry挂起时的strace输出; https://gist.github.com/map7/f25f75457f1a6ae6995934e2c2744660

    1 回复  |  直到 7 年前
        1
  •  1
  •   map7    7 年前

    在聊了一会儿之后,发现正在使用一个补丁来共享多个线程之间的DB连接。问题是,这可能会在多个同时请求的情况下产生各种问题,通常会导致测试中出现潜在的片状。删除补丁修复了测试。