python - 如何在 Django 上模拟关系
问题描述
我目前遇到了一个问题,我不知道如何模拟关系。
假设我有一些模型叫做
class MyModel(models.Model):
name = models.CharField(max_length=10)
class RelatedModel(models.Model):
my_model = models.OneToOneField(MyModel, on_delete=models.CASCADE, related_name='related_model')
name = models.CharField(max_length=10
我有一些像这样的存储库类:
class MyModelRepository:
@staticmethod
def get_related_model(my_model):
try:
return my_model.related_model
except MyModel.related_model.RelatedObjectDoesNotExist:
# do some other thing
在为此编写单元测试时,我如何模拟related_model
引发此异常或返回一些任意实例?
解决方案
这是一种无需 的方法unittest.mock
:
class MockRelatedModel:
@property
def related_model(self):
raise MyModel.related_model.RelatedObjectDoesNotExist()
如果您确实想使用unittest.mock
,可以使用PropertyMock。请注意,这尚未经过测试。坦率地说,我认为创建一个MyModel
没有设置 related_model 的实例并调用MyModelRepository.get_related_model
.
with patch('path.to.MyModel', new_callable=PropertyMock) as mock_model:
mock_model.related_model.side_effect = MyModel.related_model.RelatedObjectDoesNotExist()
instance = MyModel()
MyModelRepository.get_related_model(instance)
推荐阅读
- r - 如何删除或不显示箱线图和小提琴图中误差线上方和下方的任何数据点?
- json - Postgres JSONB 列插入错误:json 类型的输入语法无效输入字符串意外结束
- javascript - 为什么 querySelector 不能与 getElementById 一起使用?JS
- go - 如何使用分页列出表格中的所有项目
- python - 如何使这个循环更快?
- firebase - Firebase 远程配置 - 未应用条件
- javascript - 函数在 Javascript 中无需 setTimeout() 即可立即运行
- flutter - 如何在 Flutter 中设置 TabBar 在 Stack 内的位置而不会出错?
- c# - SfNavigationDrawer 上的 Prism RegionAdapter
- javascript - 在 FullCalendar 的 datesSet 中反应设置状态