Тестирование метода в Rails - PullRequest
0 голосов
/ 07 ноября 2019

Я пишу свой первый тест в рельсах, и у меня есть метод, который проверяет, является ли имя, переданное через объект животного, действительным. (Возвращает имя, если оно действительно, или nil, если нет)

animal_verifier.rb

# frozen_string_literal: true

    class AnimalVerifier
      def initialize(last_sync_at, force_sync_ids)
        @last_sync_at = last_sync_at
        @force_sync_ids = force_sync_ids
      end

      def valid_animals
        animals.each do |animal|
          if !is_valid_animal(animal.name)
            Rails.logger.info("Invalid animal name")
            next
          end
        end
      end

      def is_valid_animal(animal_name)
        animal = AnimalFinder.find(animal_name)
      end

    end

animal_verifier_test.rb

require 'test_helper'

class AnimalVerifierTest < ActiveSupport::TestCase

  test "valid animal" do
    valid_animal = @is_valid_animal.send("Beluga")
    assert valid_animal?, "valid animal"
    puts valid_animal.errors unless valid_animal.errors.empty?
  end

  test "invalid animal" do
    valid_animal = @is_valid_animal.send("Puddle")
    assert valid_animal?, "invalid animal"
    puts valid_animal.errors unless valid_animal.errors.empty?
  end
end

Когда я запускаю этот тест, яполучить ошибку:

NoMethodError:         NoMethodError: undefined method `Beluga' for nil:NilClass

Значит ли это, что у меня нет класса для AnimalVerifier? Я просто хочу проверить конкретный метод.

1 Ответ

1 голос
/ 07 ноября 2019

@is_valid_animal никогда не инициализируется в вашем тесте, поэтому nil, поэтому вы видите ошибку undefined method ... for nil:NilClass. Сначала вы должны создать тестируемый объект, а затем вызвать методы для этого.

Когда вы вызываете object.send("Beluga"), на object отправляется сообщение "Beluga", и он пытается вызвать метод с именем Beluga. Если не удается найти его в случае по умолчанию, возникает ошибка undefined method Beluga

Ваш тест должен выглядеть примерно так:

  test "valid animal" do
    verifier = AnimalVerifier.new(last_sync_at, force_sync_ids) # you need to init those thow params that are passed to the constructor
    valid_animal = verifier.is_valid_animal("Beluga")
    assert valid_animal, "valid animal"
    puts valid_animal.errors unless valid_animal.errors.empty?
  end

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

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