Вы получаете это NoMethodError
, потому что пытаетесь вызвать attributes
как метод класса :
subject { AssetIngester::Asset::GithubAsset.attributes(repo, asset_type) }
# ^^^^^^^^^^
, хотя в вашем коде attributes
определяется как метод экземпляра .
Но, кроме этого, вы спрашиваете "как можно протестировать ruby метод инициализации" , и, очевидно, ваш тестовый код полностью равен initialize
а не о attributes
, поэтому давайте начнем с начала:
describe '::attributes' do
# ...
end
Вы хотите проверить initialize,
, поэтому attributes
должно быть initialize
. И поскольку initialize
является методом экземпляра (а не методом класса), ::
должно быть #
:
describe '#initialize' do
# ...
end
И ваш subject
должен быть экземпляром GithubAsset
, который создан с помощью new
1 :
describe '#initialize' do
subject { AssetIngester::Asset::GithubAsset.new(repo, asset_type) }
# ...
end
С этим вы можете начать писать свои тесты, например:
describe '#initialize' do
subject { AssetIngester::Asset::GithubAsset.new(repo, asset_type) }
it 'sets the id attribute' do
expect(subject.id).to eq(131690)
end
end
1 В Ruby вы редко вызываете ::allocate
и #initialize
напрямую. Поэтому вместо:
obj = Array.allocate
obj.send(:initialize, 5) { |i| i ** 2 }
obj #=> [0, 1, 4, 9, 16]
вы обычно просто звоните new
и позволяете ему звонить allocate
и initialize
для вас:
obj = Array.new(5) { |i| i ** 2 }
obj #=> [0, 1, 4, 9, 16]