代码之家  ›  专栏  ›  技术社区  ›  Pickels

Python:模拟实例时出现问题

  •  1
  • Pickels  · 技术社区  · 14 年前

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

    这是描述符的代码:

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

    编辑: 函数在代码中有()我在复制代码时出错了。

    我得到的错误是 设置 ()只接受3个参数。但我注意到在答案中我不应该把元组作为最后一个参数。

    但当我在测试函数中调用validator(''.validate()时,它也不起作用。

    3 回复  |  直到 14 年前
        1
  •  3
  •   jfs    14 年前
    • validator Text 是一个对象工厂,例如,类对象
    • 验证器 test_.. 函数用作具体实例——对象工厂的产品。

    你应该给 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, '')
    
        2
  •  1
  •   Asterisk    14 年前

    我想你需要把()放在函数名后面

        3
  •  0
  •   Jough Dempsey    14 年前

    也许模仿一个实例的最好方法就是“你称自己为 实例 ?"

    不过,说真的, def test_text_validator_raises_exception: 应该是 def test_text_validator_raises_exception():

    但正如第一位评论人士所问,你对此有什么问题?