Rspec для метода модели, которые зависят друг от друга и используют гем - PullRequest
0 голосов
/ 12 января 2019

Во время моего путешествия по 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)>'

1 Ответ

0 голосов
/ 13 января 2019

Почему вы вызываете can_add_stock? на user_stock, когда это метод модели User? Вам необходимо проверить запасы для пользователя

describe 'Add stock' do
  let(:user) { User.create(email: 'test@example.com', password: 'password') }

  context 'when user add the same stock' do
    let(:stock) { Stock.create(name: 'Goldman Sachs', ticker: 'GS', last_price: 112.4) }

    it "return false" do
      user.stocks << stock
      expect(user.can_add_stock?('GS')).to eq false
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...