开发者

Python: Problems mocking an instance

开发者 https://www.devze.com 2023-01-25 01:19 出处:网络
I am having problem mocking an object to test a descriptor. This is the code of the descriptor: class Text(object):

I am having problem mocking an object to test a descriptor.

This is the code of the descriptor:

class Text(object):
    def __init__(self, default_value=u'', validators=[]):
        self.validators = validators
        self._value = default_value

    def __set__(self, instance, value):
         for validator in self.validators:
               validator(value).validate()

this is the test:

def test_text_validator_raises_exception(self):
   validator = Mock()
   validator.validate.side_effect = V开发者_运维知识库alidationError()
   text = Text(validators=[validator])
   self.assertRaises( ValidationError, text__set__, (text, '') )

Edit: The function has () in the code I did a typo when copying the code.

The error I got was that set() takes exactly 3 arguments. But I noticed in the answers that I shouldn't pass a tuple as a last argument.

But It also isn't working when I called validator('').validate() inside the test function.


  • validator in Text is an object factory e.g., class object
  • validator in the test_.. function is used as a concrete instance -- the product of an object factory.

You should give to Text() something that returns objects with .validate method not the objects themselves:

def test_text_validator_raises_exception(self):
    validator = Mock()
    validator.validate.side_effect = ValidationError()
    text = Text(validators=[Mock(return_value=validator)])
    self.assertRaises(ValidationError, text.__set__, text, '')


I guess you need to put () after function name


Maybe the best way to mock an instance is just "You call yourself an instance?"

Seriously, though, def test_text_validator_raises_exception: should be def test_text_validator_raises_exception():

But what problem are you having with it, as the first commenter asked?

0

精彩评论

暂无评论...
验证码 换一张
取 消