将变量传递给 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:in
new'
# ./spec/services/geocode_user_authorizer_spec.rb:16:in block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:56:in
block (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
我是 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:in
new' # ./spec/services/geocode_user_authorizer_spec.rb:16:inblock (3 levels) in <top (required)>' # ./spec/spec_helper.rb:56:in
block (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