Python:模拟实例时的问题

1 投票
3 回答
592 浏览
提问于 2025-04-16 06:59

我在模拟一个对象以测试一个描述符时遇到了问题。

这是描述符的代码:

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()

这是测试的代码:

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

补充: 在代码中这个函数有(),我在复制代码时打错了。

我遇到的错误是set()需要三个参数。但是我注意到在回答中提到最后一个参数不应该传递一个元组。

不过,当我在测试函数中调用validator('').validate()时,它也没有正常工作。

3 个回答

0

也许模拟一个实例的最好方法就是问:“你自己称自己是一个实例吗?”

不过说正经的,def test_text_validator_raises_exception: 应该写成 def test_text_validator_raises_exception():

但是你遇到什么问题了呢?就像第一个评论者问的那样。

1

我想你需要在函数名字后面加上()。

3
  • validatorText 中是一个对象工厂,比如说是一个类的对象。
  • validatortest_.. 函数中被用作一个具体的实例——也就是对象工厂生产出来的产品。

你应该给 Text() 提供一个能返回带有 .validate 方法的对象,而不是直接给对象本身:

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, '')

撰写回答