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
inText
is an object factory e.g., class objectvalidator
in thetest_..
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?
精彩评论