Как проверить в Ruby / Rails, был ли вызван метод в теле класса? - PullRequest
0 голосов
/ 19 октября 2018

Я не могу понять, как проверить вызовы методов класса из тела класса.

Как я могу это проверить?

class User
  act_as_paranoid
end


it 'is called from class body' do
  expect(User).to receive(:acts_as_paranoid)
  User.new
end

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Обычно рекомендуется проверять поведение, а не реализацию.В этом случае все, что acts_as_paranoid предоставляет для этого класса с точки зрения поведения, это то, что вы хотите проверить.

Однако, если вы уверены, что вызов acts_as_paranoid правильно обеспечивает все необходимое поведение и просто хотите проверить, добавлено ли оно в класс, вы можете использовать:

assert User.included_modules.include? ActsAsParanoid::Core

Комучтобы понять это, я только что кратко рассмотрел исходный код act_as_paranoid здесь: https://github.com/ActsAsParanoid/acts_as_paranoid/blob/master/lib/acts_as_paranoid.rb#L8

Вы можете видеть, что в строке 50 он расширяет модуль ActsAsParanoid до ActiveRecord :: Base, который предоставляет классам модели доступ кacts_as_paranoid метод.И если вы посмотрите на определение этого метода, вы увидите, что он вызывает include ActsAsParanoid::Core

0 голосов
/ 19 октября 2018

Чтобы просто проверить, что вы добавили acts_as_paranoid к User, вы можете сделать:

it 'has acts_as_paranoid' do expect(User).to respond_to(:acts_as_paranoid) end

0 голосов
/ 19 октября 2018

Обновлено

Это не самый лучший способ сделать это, но если вам нужно, это ближе к тому, что вы хотите:

describe 'Check if a string method is in a file' do
  it 'matches a string pattern' do
    lines = File.read('user.rb').split("\n")
    assert lines[1][/\b+acts_as_paranoid/]
    #hacky way to make sure you don't accidentally comment it out
    assert lines[1].split('#').count == 1 
  end
end

Оригинальный ответ:

Тамздесь нечего проверятьВаше определение класса недопустимо, если ваш метод не определен при загрузке файла user.rb.Это ядро ​​рубина.Докажите это.

#user_spec.rb
require 'minitest/autorun'
require_relative 'user'

describe 'User' do
  it 'is a valid class' do
    assert User
  end
end

#user.rb
class User
  acts_as_paranoid
end

Если acts_as_paranoid не определено до того, как ruby ​​загрузит user.rb, спецификация завершится неудачно, как только потребуется файл.Если это весь код, который у вас есть, этот тест не пройден.Комментарий из acts_as_paranoid тест пройдёт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...