Ruby с RSpec NoMethodError: неопределенная длина метода для nil: NilClass - PullRequest
0 голосов
/ 29 сентября 2018

Я новичок в Ruby и RSpec, пытаюсь написать единичный регистр для длины строки.У меня есть 3 файла rb следующим образом: 1. Вызов файла

require_relative 'ruby_final_operations'
require_relative 'ruby_helper'
require 'uri'
require 'open-uri'
require 'prime'
module RubyOperations
 # Public: Various commands for the user to interact with RubyCommand.
  class Command
    res = RubyOperations::Operations.new
res.letter_count(res.inputstr)

2-й файл - реализация метода

    require_relative 'ruby_helper'
require 'logger'
$FILE_LOG = RubyOperations.create_log(File.expand_path('~/RubyOperations_LOG.log'), Logger::DEBUG)
$STD_LOG = RubyOperations.create_log(nil, Logger::INFO)
module RubyOperations
class Operations

def inputstr
      RubyOperations.log('Enter the String:[Length 20]',:BOTH)
      @str = gets.chomp
      raise StandardError if @str =~ /\d/ || @str.empty? || @str.length > 20
    rescue StandardError,ArgumentError => e
      RubyOperations.log(e,:ERROR)
    end

def letter_count(str)
    result = @str.length
      RubyOperations.log("The number of letters in the string: #{result}",:BOTH)
end

3-й файл - RSpec

require 'ruby_final_operations'

describe 'RubyOperations' do
  describe 'Operations' do
   subject = RubyOperations::Operations.new
describe '.letter_count' do
     context 'when operation is provided' do
      it 'returns letter count' do
        allow(subject.letter_count("hello").to receive(:result).and_return(5)
      end
    end
   end

Проблема заключается вчто во 2-м файле он имеет аргумент 'str', но набранная строка хранится как '@str'.Как я могу передать строку "привет" из файла rspec, чтобы проверить это.

1 Ответ

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

Есть несколько проблем:

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

def letter_count #get rid of argument, the argument does nothing, 
                 #basically it looks you added the argument, 
                 # just, so you can call the other method there.

Сделайте ваш основной простой, с помощьючеткая последовательность

res.inputstr
res.letter_count

Но по поводу вашего фактического вопроса, в своем тесте вы меняете неправильную вещь неправильным методом

allow(subject.letter_count("hello").to receive(:result).and_return(5)
# letter count should do the log entry, not return five, at least that what your method say

Так что вы, вероятно, хотитеустановить @str перед проверкой метода letter_count.

 subject.instance_variable_set("hello")
 # then test for what you expect the method to return
 expect(subject.letter_count).to eq(5)
 # this specific test will fail, because you are doing a log entry, and not return the length on letter_count.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...