我有一个模型,其中电子邮件字段是唯一的。我认为它会使每封电子邮件都小写,因为它在 User 实例上有 normalize_email() 方法。但是,它仅规范化域部分,因此如果 company@gmail.com 存在,则 Company@gmail.com 被认为是唯一的。因此,我决定在序列化程序中创建 validate_email() 以始终返回小写电子邮件。这是一个现场验证,并在文档中进行了描述。
def validate_email(self, value):
return value.lower()
Run Code Online (Sandbox Code Playgroud)
但是,看起来此方法在序列化程序检查数据库中是否存在该值后返回该值。这是一个例子:
如果我尝试使用 user@gmail.com 创建用户并且该用户已经存在,它将返回“用户已存在”,这是预期的。但是,如果我使用 User@gmail.com 运行,它将首先运行 SQL 请求并检查 User@gmail.com != user@gmail.com,然后它将尝试使用 user@gmail.com 创建一个新实例因为它是从 validate_email() 返回的,并且会引发 IntegrityError,因为它变成了已经在数据库中的 user@gmail.com!
我可以做类似的事情
def validate_email(self, value):
norm_email = value.lower()
if User.objects.filter(email=norm_email).exists():
raise serializers.ValidationError("Not unique email")
return norm_email
Run Code Online (Sandbox Code Playgroud)
但这是对数据库的另一个请求,我不想要它。
所以我的问题是什么方法运行 SQL 请求来检查数据库中的唯一性?这样我就可以覆盖它并传递已经小写的值?
我正在使用mockk Kotlin 库。我有一个服务 Service,它有一个调用 3d 方客户端的私有方法
class Service {
fun foo() {
bar()
}
private fun bar() {
client = Client()
client.doStuff()
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的测试中我需要模拟客户端,例如
@Test
fun `my func does what I expect` {
}
Run Code Online (Sandbox Code Playgroud)
我还需要模拟 doStuff 返回的内容。我如何在 Kotlin mockk 中实现这一点?