2016-12-01 4 views
2

Я пытаюсь проверить, что два объекта равны. Тип этих объектов - это Point, который является классом, определенным ROS (Robot Operating System). У меня есть следующий тест:Неподдерживаемые операнды (ы) при попытке assertAlmostEqual/assertEqual

def test_when_getting_position_after_2s_then_position_at_2s_is_returned(self): 
    self.expected_position.x = -self.radius 
    self.expected_position.y = 0 
    self.assertAlmostEqual(
     self.expected_position, 
     self.trajectory.get_position_at(2)) 

Я использую unittest, и когда я пытаюсь утверждать, если они почти равны, я получаю сообщение об ошибке, которая говорит:

TypeError: unsupported operand type(s) for -: 'Point' and 'Point'

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

self.assertAlmostEqual(self.expected_position.x, self.trajectory.get_position_at(1).x) 
self.assertAlmostEqual(self.expected_position.y, self.trajectory.get_position_at(1).y) 

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

Edit: Полный отслеживающий за исключением является:

Error 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/unittest/case.py", line 329, in run 
    testMethod() 
    File "/home/m/turtlebot_ws/src/trajectory_tracking/src/test/trajectory/test_astroid_trajectory.py", line 26, in test_when_getting_position_after_1s_then_position_at_1s_is_returned 
    self.assertAlmostEqual(self.expected_position, self.trajectory.get_position_at(1)) 
    File "/usr/lib/python2.7/unittest/case.py", line 554, in assertAlmostEqual 
    if round(abs(second-first), places) == 0: 
TypeError: unsupported operand type(s) for -: 'Point' and 'Point' 
+0

Что такое * полная трассировка исключения? –

+0

@MartijnPieters, я только что отредактировал свой вопрос, предоставив полную трассу. – lmiguelvargasf

ответ

3

assertAlmostEqual(a, b) требует abs(a - b) быть действительным, но вы не определили оператор вычитания для типа Point, таким образом, ошибка.

class Point(object): 
    ... 
    def __sub__(self, other): # <-- define the subtraction operator so `a - b` is valid 
     return Vector(self.x - other.x, self.y - other.y) 

class Vector(object): 
    ... 
    def __abs__(self): # <-- define the absolute function so `abs(v)` is valid 
     return (self.x*self.x + self.y*self.y)**0.5 

Если вы не можете предоставить __sub__ в определении класса, вы могли бы использовать обезьяну-зашивки, чтобы обеспечить его в тесте.

def sub_point(self, other): 
    return complex(self.x - other.x, self.y - other.y) 
    #^for simplicity we abuse a complex number as a 2D vector. 

Point.__sub__ = sub_point 
+0

Ницца !! Настройтесь на функцию 'return' функции абсолютного значения. –

+0

@kennytm, что, если эти классы предоставляются каркасом? Как я могу это сделать, следует ли использовать наследование и реализовать этот метод на них, или есть способ сделать расширение класса? – lmiguelvargasf

+0

@ Ev.Kounis Спасибо, исправлено :) – kennytm

 Смежные вопросы

  • Нет связанных вопросов^_^