我试图测试一个方法,在其中创建另一个类的实例,我试图模拟内部类的创建......这对我不起作用.我尝试将问题复制到一个简化的案例 - 但仍然没有去.这是简化的案例:
我有一个新的目录pymock与__init__.py它.除此之外,还有以下3个文件:
foo.py
#!/usr/bin/python
class Foo(object):
def foo1(self):
return 1
Run Code Online (Sandbox Code Playgroud)
goo.py
#!/usr/bin/python
from foo import Foo
class Goo(object):
def goo1(self):
f = Foo()
return f.foo1()
Run Code Online (Sandbox Code Playgroud)
goo_test.py
#!/usr/bin/python
from mock import patch, Mock
from nose.tools import assert_equal
from goo import Goo
class TestGoo(object):
def setup(self):
self.goo = Goo()
@patch('pymock.foo.Foo', autospec=True)
def test_goo1(self, foo1_mock):
foo_instance = Mock()
foo1_mock.return_value = foo_instance
foo_instance.foo1.return_value = 11
assert_equal(11, self.goo.goo1())
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我有一个带有状态字段的模型,如下所示:
PENDING = 'pending'
DONE = 'done'
CANCELED = 'canceled'
class Event:
EVENT_STATUSES = [(1, PENDING), (2, DONE), (3, CANCELED)]
status = models.CharField(max_length=20, choices=EVENT_STATUSES, default=PENDING)
Run Code Online (Sandbox Code Playgroud)
我有一个序列化器:
class EventUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = ('status')
Run Code Online (Sandbox Code Playgroud)
当使用以下 JSON 调用它时:
{
"status": "done"
}
Run Code Online (Sandbox Code Playgroud)
我得到回应:
{
"status": [
"\"done\" is not a valid choice."
]
}
Run Code Online (Sandbox Code Playgroud)
我认为问题在于逃避完成,但为什么呢?我该如何预防呢?
(我有一个内容类型 application/json 标头)。
我正在写一个Telegram机器人,为了简化问题,假设您可以在渠道中询问机器人问题并且它会私下回复您.当僵尸程序收到命令时,它将chat_id从用户处获取:update.message.from_user.id
但是当我这样做时,我收到一个错误:
Unauthorized: Forbidden: bot can't initiate conversation with a user
Run Code Online (Sandbox Code Playgroud)
这听起来很合乎逻辑,因为我认为这可以防止编写垃圾邮件机器人.问题是我该如何克服它?如何让用户从机器人启用私人消息?
注意:僵尸程序确实成功向我发送消息但不向其他用户发送消息.
我的模型看起来像这样:
class SomeModel(model.Model):
pass
class Base(models.Model):
field1 = ...
class Mixin1(models.Model):
some_model = models.ForeignKey('SomeModel', on_delete=models.CASCADE)
class Meta:
abstract = True
class Derive1(Base, Mixin1):
field2 = ...
class Derive2(Base, Mixin1):
field3 = ...
class Derive3(Base):
field4 = ...
Run Code Online (Sandbox Code Playgroud)
现在我希望能够获取从Base和 派生的所有对象Mixin1,而无需显式列出所有使用 的类Mixin1。就像是:
Base.objects.filter(some_model=X)
Run Code Online (Sandbox Code Playgroud)
我明白为什么这不起作用,但我不知道如何让它真正起作用。
解决方案:感谢valentjedi 的回答,我找到了一个可行的解决方案。我将其发布在这里,以防有一天它会对某人有所帮助。
除了希望将所有结果放在一起之外,我还希望它们按 Base 中的日期字段排序,并能够自由过滤它们。所以我在Mixin1函数中创建了:
@staticmethod
def get_mixin1_objects(some_model, q_filter=None):
mixin_models = set(Mixin1.__subclasses__()) & set(Base.__subclasses__())
results = []
for mdl in mixin_models:
apply_filter = Q(some_model=some_model)
if q_filter is …Run Code Online (Sandbox Code Playgroud)