Laravel 11单元测试使用Eloquent工厂创建关联模型时触发BadMethodCallException错误
Laravel 11单元测试使用Eloquent工厂创建关联模型时触发BadMethodCallException错误
我帮你定位到问题的根源啦!你代码里的链式调用顺序出错了——create()方法应该放在所有工厂关联定义(比如has())的最后,而不是中间。
你当前的写法是先调用create()生成了Pulse模型实例,接着在模型实例上调用has()方法。但has()是工厂类的专属方法,不是模型实例的方法,这就导致Laravel内部错误地尝试调用工厂类不存在的getRelated()方法,最终抛出了这个异常。
修正后的代码
把create()移到整个链式调用的末尾,确保所有关联定义都在工厂实例上完成,最后再执行创建操作:
Pulse::factory() ->has( PulseAnswer::factory() ->count(1) ->has( PulseReply::factory() ->count(1) ) ) ->create([ 'pulse_period_start_date' => '2021-01-01', 'pulse_period_end_date' => '2021-01-31', 'submitted_by_id' => $submitter, 'reviewed_by_id' => $reviewer, 'reviewed_at' => '2021-02-01' ]);
补充说明
Laravel Eloquent工厂的链式调用逻辑是:所有用于定义模型结构、关联关系的方法(比如has()、for()、state())都需要在工厂实例上调用,而create()/make()这类执行生成操作的方法,必须放在最后一步——因为它们会终止工厂的链式调用,直接返回实际的模型实例。
这样调整后,工厂就能正确识别你要创建的关联关系,自动生成Pulse、关联的PulseAnswer和PulseReply数据了。
备注:内容来源于stack exchange,提问作者Drew Gallagher
相关产品推荐
相关产品推荐

