在我的models.py中,我有:
export function foo() {
setTimeout(() => {
window.open('http://google.com');
}, 0);
}
describe('foo', () => {
beforeEach(() => {
jest.useFakeTimers();
global.open = jest.fn();
});
it('calls open', () => {
foo();
expect(setTimeout).toHaveBeenCalledTimes(1);
expect(global.open).toBeCalled(); //FAILING
});
});
在我的django shell中,我尝试了以下操作:
def MakeOTP():
import random,string
return ''.join(random.choices(string.digits, k=4))
class Prescriptionshare(models.Model):
prid = models.AutoField(primary_key=True, unique=True)
customer = models.ForeignKey(
customer, on_delete=models.CASCADE, null=True)
time = models.DateTimeField(default=timezone.now)
checkin =models.ForeignKey(Checkins, on_delete=models.CASCADE, null=True)
otp = models.CharField(max_length=5, default=MakeOTP())
问题是每次执行此操作时,我都会在otp字段中得到相同的字符串。字符串没有随机变化。 为什么会这样?
答案 0 :(得分:5)
从 ()
中删除 default=MakeOTP()
class Prescriptionshare(models.Model):
# your code
otp = models.CharField(max_length=5, default=MakeOTP) # here, remove the "()"
在模型中进行更改后,您应该迁移数据库
为什么会这样?
如果使用 MakeOTP()
,则Django会获取函数的输出,就好像您使用 MakeOTP
(不带括号)时,Django会将其视为< strong> 可调用函数 。
也就是说,当使用括号时,方法在运行迁移后即被调用,并且其值 用作默认值 ;而当不使用括号时, 在创建对象时每次调用的功能参考 。