2014-12-16 3 views
2

У меня есть функция, которая должна установить атрибут объекта к PIL экземпляра изображения:assertIsInstance() против нескольких имен классов

from PIL import Image 

class SimpleExample: 
    def __init__(self): 
     self.img = self.load_image() 

    def load_image(): 
     self.img = Image.open(image) 

Для проверки надлежащего исполнения load_image() я думал использовать unittest.TestCase. assertIsInstance(), но интроспекция результирующего экземпляра дает другой класс . имя в зависимости от типа файла загруженного изображения. Я не могу найти что-либо по строкам assertIsInstanceFromModule() в unittest, так что это, похоже, помощник утверждения, который лучше всего отражает то, что я действительно пытаюсь проверить.

Я придумал пару решений, но я не удовлетворен ни с одной из них:

использовать цикл Подготовить список всех возможных имен классов, перебирать, хотя список, проверить каждый элемент равенства, затем assertIsInstance для соответствующего члена списка. Это неудобно, бесстрашно, и я, конечно, не очень этому горжусь. Однако он работает, и он использует то, что, по моему мнению, является самым значимым утверждением.

simplified_names = ['JpegImageFile', 'PngImageFile'] 
for i, name in enumerate(simplified_names): 
    if SimpleExample.img.__class__.__name__ == name: 
     TestCase.assertIsInstance(SimpleExample.img, simplified_names[i]) 

Использование другого помощника утверждения Подготовить список всех возможных имен классов и утверждают, что имя класса создаваемого объекта в этом списке. Это работает, это просто, но мне не нравится, что я на самом деле утверждаю здесь.

simplified_names = ['JpegImageFile', 'PngImageFile'] 
TestCase.assertIn(SimpleExample.img.__class__.__name__, simplified_names) 

Есть ли у кого-нибудь другое представление о том, как утверждать против нескольких возможных имен классов? Должен ли я приближаться к тесту с другого направления и использовать другое утверждение? Это мой первый набег на unittest. Должен ли я вернуться к простому тестированию моего кода с помощью печати?

~~~~~ И очевидный ответ ...

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

TypeError: isinstance() arg 2 must be a type or tuple of types 

акцент на «или кортежа.»

Спасибо за помощь Martijn Pieters.

ответ

5

Использовать родительский класс ; вам все равно, какой из многих подклассов это, просто если это файл изображения.

Второй аргумент assertIsInstace() должен быть сам класс, а не имя класса:

from PIL import ImageFile 

self.assertIsInstance(SimpleExample.img, ImageFile.ImageFile) 

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

from PIL import Image 

self.assertIsInstance(SimpleExample.img, Image.Image) 

Если вы когда-нибудь понадобится, чтобы проверить против нескольких классов, isinstance() (и расширением, assertIsInstance()) также принимает кортеж классов в качестве второго Аргумент:

>>> foo = 'bar' 
>>> isinstance(foo, (str, int, float)) 
True 
+0

Если я пытаюсь это: 'assertIsInstance (IMG, PIL)' он выдает ошибку типа: 'TypeError: isinstance() аргумент 2 должен быть тип или кортеж types' ли я непонимание, что вы предлагаете? –

+0

@Jefe: Я включил образец теста. –

+0

Да, это и было. Спасибо. Не могли бы вы объяснить, насколько я должен был найти правильное имя родительского класса? Я проверил .__ class__ на экземпляр объекта, на который я смотрю, и это, очевидно, не так. –

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

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