将变量传递给 rspec 测试

Passing variable to an rspec test

我是 rspec 测试的新手,我在尝试测试用户位置时遇到了问题。这是模拟 country_code 阻止来自特定区域的垃圾邮件的行为的测试。

这是我的服务代码:

class GeocodeUserAuthorizer
  def initialize(user_country_code:)
    @user_country_code = user_country_code
  end

  def authorize!
    user_continent = ISO3166::Country.new(user_country_code).continent

    if user_continent == 'Africa'
      return true
    else
      return false
    end
  end
end

这是我的规范文件的代码:

require 'spec_helper'

describe GeocodeUserAuthorizer do
  context 'with a user connecting from an authorized country' do
    it { expect(GeocodeUserAuthorizer.new.authorize!(user_country_code: { "CA" })).to eql(true) }
  end
end

这里是失败代码:

Failures:

1) GeocodeUserAuthorizer with a user connecting from an authorized country Failure/Error: it { expect(GeocodeUserAuthorizer.new.authorize!(user_country_code: { "CA" })).to eql(true) } ArgumentError: missing keyword: user_country_code # ./app/services/geocode_user_authorizer.rb:2:in initialize' # ./spec/services/geocode_user_authorizer_spec.rb:16:innew' # ./spec/services/geocode_user_authorizer_spec.rb:16:in block (3 levels) in <top (required)>' # ./spec/spec_helper.rb:56:inblock (3 levels) in ' # ./spec/spec_helper.rb:56:in `block (2 levels) in '

有人可以帮忙吗?

您没有正确调用 class,您的构造函数需要国家代码。试试这个:

describe GeocodeUserAuthorizer do
  context 'with a user connecting from an authorized country' do
    it { expect(GeocodeUserAuthorizer.new(user_country_code: { "CA" })).authorize!).to eql(true) }
  end
end

如果您希望 authorize! 在没有 @ 符号的情况下使用它,您还需要在 class 中为 user_country_code 添加一个 attr_reader .

好的,所以我的测试太复杂而且没有分离。这是有效的最终版本。

测试:

require 'spec_helper'

describe GeocodeUserAuthorizer do
  let(:geocode_authorizer) { GeocodeUserAuthorizer.new(country_code: country_code) }

  context 'with a user connecting from an unauthorized country' do
    let!(:country_code) { 'AO' }

    it { expect(geocode_authorizer.authorize!).to eql(false) }
  end

  context 'with a user connecting from an authorized country' do
    let!(:country_code) { 'CA' }

    it { expect(geocode_authorizer.authorize!).to eql(true) }
  end
end

服务:

class GeocodeUserAuthorizer
  def initialize(country_code:)
    @country_code = country_code
  end

  def authorize!
    check_country
  end

  protected

    def check_country
      user_continent = ISO3166::Country.new(@country_code).continent

      if user_continent == 'Africa'
        return false
      else
        return true
      end
    end
end