Странная ошибка при модульном тестировании конкретной функции в Ruby - PullRequest
2 голосов
/ 03 сентября 2011

Я работаю над этим Упражнением 49 в Изучите Руби на Сложном Пути

В упражнении предлагается написать модульный тест для каждой предоставленной функции. Один из написанных мной модульных тестов дает мне ошибку.

Вот код, который я тестирую (word_list - массив парных структур)

Pair = Struct.new(:token, :word)

def peek(word_list)
    begin
        word_list.first.token
    rescue
        nil
    end
end

def match(word_list, expecting)
    begin
        word = word_list.shift
        if word.token == expecting
            word
        else
            nil
        end
    rescue
        nil
    end
end

def skip(word_list, token)
    while peek(word_list) == token
        match(word_list, token)
    end
end

Вот тест:

def test_skip
    small_list = [Pair.new(:verb, 'go'), Pair.new(:verb, 'do')]
    skip(small_list, :verb)
    assert_equal([],small_list) 
end

Вот ошибка, которую я получаю при запуске модульного теста:

  1) Error:
test_skip(SentenceTests):
TypeError: backtrace must be Array of String
    test_sentence.rb:23:in `test_skip'

В этом случае строка 23 ссылается на «skip (small_list,: verb)». Я не уверен, почему происходит эта ошибка, две вышеупомянутые функции также были протестированы модульно, и эти тесты прошли хорошо.

@ Забба, я поставил их точно так, как указано в упражнении выше:

class ParserError < Exception

end

Если кому-то нужны точные файлы, которые я здесь использую, это ссылка на суть: https://gist.github.com/1190148

1 Ответ

2 голосов
/ 03 сентября 2011

Линия

skip(small_list, :verb)

заставляет ваш тест пропустить весь список (2 глагола). Наконец-то пусто. Таким образом, small_list.first - это nil, у которого нет метода / поля word.

Я получаю ошибку

undefined method `word' for nil:NilClass (NoMethodError)

хотя.

Возможно, в вашем коде это исключение перехватывается другим кодом, который сам вызывает исключение, которое вы видите.

UPDATE

Оказывается, в тесте / модуле Ruby 1.9 (точнее, в мини-тесте / модуле, на котором он основан) есть метод skip, который сталкивается с вашим skip. См. minitest / unit.rb , строка 610. Этот метод вызвал исключение, поскольку ожидал, что его второй параметр будет массивом.

Просто переименуйте свой skip.

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