Проверка того, что правильный объект возвращается в нос (Изучите Python, Hard Way Ex 49) - PullRequest
1 голос
/ 12 июля 2011

Я работал над «Изучай Python: трудный путь», 2-е издание, и это было потрясающе. Мой вопрос связан с Упражнением 49 (http://learnpythonthehardway.org/book/ex49.html),, которое касается написания носовых юнит-тестов, охватывающих код, приведенный в книге. Я пытался написать тест, который охватывает эту функцию:

def parse_subject(word_list, subj):
    verb = parse_verb(word_list)
    obj = parse_object(word_list)
    return Sentence(subj, verb, obj)

Я пытался запустить этот тест:

from nose.tools import *
from ex48 import engine
def test_parse_subject():
  word_list = [('verb', 'verb'),
               ('direction', 'direction')]
  test_subj = ('noun', 'noun')
  test_verb = ('verb', 'verb')
  test_obj = ('direction', 'direction')
  assert_equal(engine.parse_subject(word_list, ('noun', 'noun')), 
               engine.Sentence(test_subj, test_verb, test_obj))

Но возвращается с ошибкой, поскольку два объекта Sentence не являются EXACT одним и тем же объектом:

⚡ nosetests                
.....F..........
======================================================================
FAIL: tests.engine_tests.test_parse_subject
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/nose/case.py", line 187, in runTest
    self.test(*self.arg)
 File "/Users/gregburek/code/LPTHW/projects/ex48/tests/engine_tests.py", line 59, in test_parse_subject
    engine.Sentence(test_subj, test_verb, test_obj))
AssertionError: <ex48.engine.Sentence object at 0x101471390> != <ex48.engine.Sentence object at 0x1014713d0>

----------------------------------------------------------------------
Ran 16 tests in 0.018s

FAILED (failures=1)

Как я могу использовать нос, чтобы проверить, что два объекта должны быть одинаковыми?

Ответы [ 5 ]

2 голосов
/ 22 ноября 2011

Я вроде как нуб, сейчас работаю над тем же самым точным упражнением № 49, столкнулся с той же ошибкой и у меня тот же вопрос, что и у вас.Поскольку никто больше не ответил, я подумал, что могу также добавить то, что сделал, просто разбив объект предложения на три части и убедившись, что они эквивалентны.Это выглядит примерно так:

def test_parse_subject():
word_list = [('verb','run'),
             ('noun','Bear'),
             ('verb','jump')]
subj = ('noun', 'me')
result = ex49.parse_subject(word_list,subj)
assert_equal(result.subject, 'me')
assert_equal(result.verb, 'run')
assert_equal(result.object, 'Bear')

Хотелось бы узнать, есть ли в функции nose.tools функция прямого сравнения эквивалентности объектов.

1 голос
/ 01 ноября 2013

Та же проблема здесь.Не уверен, что это лучше, чем то, что сделал Томас, но вместо того, чтобы просто сравнивать значения объекта, я создал другой объект в тесте, дав ему точные значения, которые я ожидал.

Я также использовал встроенную функцию vars () и импортировал pprint из модуля pprint, чтобы мне не приходилось сравнивать каждое значение отдельно.

from nose.tools import *
from pprint import pprint
from ex49 import sentence_parser

    def test_parse_sentence():
            # Test word list for parser to parse
            word_list = [('verb', 'verb'), ('stop', 'stop'), ('noun', 'noun')]

            # Here I create an object using the parse_sentence function
            theSentence = sentence_parser.parse_sentence(word_list)

            #Then I use assert_equal to compare the object created by the parse_sentence function to an object that I create by passing it the expected values.
            assert_equal(pprint(theSentence),
                         pprint(sentence_parser.Sentence(('noun', 'player'),
                                                  ('verb', 'verb'),
                                                  ('noun', 'noun'))))
0 голосов
/ 15 августа 2014

Вы также можете попробовать:

class Sentence(object):
    def __init__(self, subject, verb, obj):
        self.subject = subject[1]
        self.verb = verb[1]
        self.object = obj[1]

    def __eq__(self, other):
        if type(other) is type(self):
            return self.__dict__ == other.__dict__
        else:
            return False
0 голосов
/ 07 марта 2014

Этот шпаргалка пользователя github (bitsai) использует другую технику, которую вы также можете попробоватьДобавление метода в класс Sentence, который преобразует атрибуты класса в кортеж.Стоит попробовать.Я использую это, и это имеет еще больше смысла.

Нажмите здесь .

0 голосов
/ 05 июня 2013

В качестве альтернативы, добавьте метод ниже к классу Sentence, и ваш оригинальный assert_equal должен работать. Другими словами, вы утверждаете, равны ли два объекта. Если вы думаете, что два объекта Sentence равны друг другу, если значения всех переменных экземпляра идентичны, то приведенные ниже коды достигают того, что вы хотите:

class Sentence(object):
...
# Python 2.X
def __cmp__(self, other):
    return self.__dict__ == other.__dict__

# Python 3.X
def __eq__(self, other):
    return self.__dict__ == other.__dict__
...

Надеюсь, это поможет!

...