【问题标题】:ArgumentError: wrong number of arguments (0 for 2) in initialize with inheritanceArgumentError:使用继承进行初始化时的参数数量错误(0 代表 2)
【发布时间】:2015-08-10 07:05:01
【问题描述】:

好的,

这让我发疯了,因为我不明白这种情况下的错误。 我定义了以下类:

module Admins
  class BasePresenter < ::BasePresenter
    def render_customer(id:)
      return I18n.t('admin.admin') if id.nil?
      ::Customer.where(id: id).first.try(:name) || I18n.t('admin.deleted')
    end

    def percent_of(count, total)
      ((count.to_f / total.to_f) * 100.0).to_i
    end
  end
end

继承自下面的BasePresenter

class BasePresenter

  def initialize(object, template)
    @object = object
    @template = template
  end

  def self.presents(name)
    define_method(name) do
      @object
    end
  end

  def underscored_class
    @object.class.name.underscore
  end


  protected


  def h
    @template
  end

  def handle_none(value, html = true)
    if value.present?
      if block_given?
        yield
      else
        value
      end
    else
      return h.content_tag(:span, '-', class: 'none') if html
      '-'
    end
  end

  def current_customer
    @current_customer ||= h.current_customer
  end

  def current_user
    @current_user ||= h.current_user
  end

end

但是,当我尝试运行我的规范时,我从 RSpec 收到以下错误:

ArgumentError:参数数量错误(0 代表 2) ./app/presenters/base_presenter.rb:3:in initialize' ./spec/presenters/admins/base_presenter_spec.rb:24:inblock (3 水平)在'

该类与其他存在没有什么不同,继承以完全相同的方式工作并且那些测试通过了。 只是这个类的测试因为这个错误而失败,并且只有在测试方法percent_of时才失败。

我没看到什么?

编辑

这是我的 RSpec 测试:

require 'spec_helper'

describe ::Admins::BasePresenter do
  describe '#render_customer' do

    let(:customer) { Customer.first }
    subject { ::Admins::BasePresenter.new(Object.new, ApplicationController.new.view_context) }

    it 'returns the I18n translations for (admin) when no customer is set.' do
      expect(subject.render_customer(id: nil)).to eql(I18n.t('admin.admin'))
    end

    it 'returns the proper name when a valid ID is given' do
      expect(subject.render_customer(id: customer.id)).to eql(customer.name)
    end

    it 'returns the I18n translations for (deleted) when an invalid ID is given' do
      expect(subject.render_customer(id: -1)).to eql(I18n.t('admin.deleted'))
    end
  end

  describe '#percent_of' do
    it 'calculates the percentage correctly' do
      expect(subject.percent_of(0, 1)).to eql(0)
      expect(subject.percent_of(1, 1)).to eql(100)
      expect(subject.percent_of(1, 2)).to eql(50)
      expect(subject.percent_of(1, 3)).to eql(33)
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby inheritance rspec


    【解决方案1】:

    呃,

    我是个白痴…… 问题是我的subject 是在Describe 块中定义的特定测试,而第二个没有任何测试。 这意味着我们的钩子会尝试在外部描述块中创建该类的实例...

    这是修复:

    require 'spec_helper'
    
    describe ::Admins::BasePresenter do
      let(:customer) { Customer.first }
      subject { ::Admins::BasePresenter.new(Object.new, ApplicationController.new.view_context) }
    
      describe '#render_customer' do
        it 'returns the I18n translations for (admin) when no customer is set.' do
          expect(subject.render_customer(id: nil)).to eql(I18n.t('admin.admin'))
        end
    
        it 'returns the proper name when a valid ID is given' do
          expect(subject.render_customer(id: customer.id)).to eql(customer.name)
        end
    
        it 'returns the I18n translations for (deleted) when an invalid ID is given' do
          expect(subject.render_customer(id: -1)).to eql(I18n.t('admin.deleted'))
        end
      end
    
      describe '#percent_of' do
        it 'calculates the percentage correctly' do
          expect(subject.percent_of(0, 1)).to eql(0)
          expect(subject.percent_of(1, 1)).to eql(100)
          expect(subject.percent_of(1, 2)).to eql(50)
          expect(subject.percent_of(1, 3)).to eql(33)
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多