Во время моего путешествия по RSpec я хочу протестировать 3 метода из моей пользовательской модели, каждый из которых зависит друг от друга. Они являются своего рода методом помощников для gem stock_qoute и просто проверяют, был ли элемент поиска (акция) уже добавлен в портфель или пользователь уже достиг предела добавленных позиций (10 акций). Эти методы используются в поле зрения.
Я пытался издеваться над этим драгоценным камнем, но я думаю, что это не самый простой способ сделать это. Я думаю, что могу пропустить весь драгоценный камень и использовать только переменную, но я понятия не имею, как это сделать. Я использую devise и Rspec без FactoryBot.
user.rb
has_many :user_stocks
has_many :stocks, through: :user_stocks
def stock_already_added?(ticker_symbol)
stock = Stock.find_by_ticker(ticker_symbol)
return false unless stock
user_stocks.where(stock_id: stock.id).exists?
end
def under_stock_limit?
(user_stocks.count < 10)
end
def can_add_stock?(ticker_symbol)
under_stock_limit? && !stock_already_added?(ticker_symbol)
end
метод find_by_ticker из другой модели:
def self.find_by_ticker(ticker_symbol)
where(ticker: ticker_symbol).first
end
просмотреть файл:
<% if current_user.can_add_stock?(@stock.ticker) %>
<%= link_to 'Add stocks', user_stocks_path(user: current_user, stock_ticker: @stock.ticker),
class: 'btn btn-xs btn-success', method: :post %>
<% else %>
<span class="label label-default">
Stock cannot be added because you have added
<% if !current_user.under_stock_limit? %>
10 stocks
<% end %>
<% if current_user.stock_already_added?(@stock.ticker) %>
this stock
<%= link_to 'Remove', user_stock_path, method: :delete %>
<% end %>
</span>
<% end %>
user_spec.rb:
describe 'Add stock' do
user = User.create(email: 'test@example.com', password: 'password')
context 'when user add the same stock' do
let(:stock) { Stock.new(name: 'Goldman Sachs', ticker: 'GS', last_price: 112.4) }
it "return false" do
user_stocks = UserStock.new(user: user, stock: stock)
expect(user_stocks.can_add_stock?('GS')).to eq false
end
end
end
Сейчас у меня ошибка:
1) Пользователь Добавляет товар, когда пользователь добавляет тот же товар, возвращается false
Ошибка / ошибка: ожидайте (user_stocks.can_add_stock? ('GS')). Eq true
NoMethodError:
undefined method `can_add_stock?' for #<UserStock:0x00007fb0efa4d3a8>
# ./spec/models/user_spec.rb:29:in `block (4 levels) in <top (required)>'