gpt4 book ai didi

unit-testing - 测试使用 after_create 回调的模型规范

转载 作者:行者123 更新时间:2023-12-04 05:25:08 26 4
gpt4 key购买 nike

这是我正在使用的模型,我已将其简化为最简单的形式,但仍然无法满足我的示例:

class User <  ActiveRecord::Base
after_create :setup_lists

def setup_lists
List.create(:user_id => self.id, :name => "current")
List.create(:user_id => self.id, :name => "master")
end
end

我想对示例进行如下说明:
require 'spec_helper'

describe User do
before(:each) do
@user = Factory(:user)
end

describe "#setup_lists" do
before(:each) do
List.stub(:create).with(:name => "current")
List.stub(:create).with(:name => "master")

it "creates a new master list" do
List.should_receive(:create).with(:name => "master")
end

it "creates a new current list" do
List.should_receive(:create).with(:name => "current")
end
end
end

我期望的工作正常,但我留下了以下错误:
Failures:
1) User#setup_lists creates a new master list
Failure/Error: List.should_receive(:create).with(:name => "current")
(<List(id: integer, name: string, created_at: datetime, updated_at: datetime, user_id: integer) (class)>).create({:name=>"current"})
expected: 1 time
received: 0 times
# ./spec/models/user_spec.rb:44

2) User#setup_lists creates a new current list
Failure/Error: List.should_receive(:create).with(:name => "master")
(<List(id: integer, name: string, created_at: datetime, updated_at: datetime, user_id: integer) (class)>).create({:name=>"master"})
expected: 1 time
received: 0 times
# ./spec/models/user_spec.rb:48

有人能帮我理解为什么会这样吗?

最佳答案

三个问题:

1) User 对象是在设置消息期望之前创建的,所以 should_receive永远不会看到消息;

2)您正在淘汰您也为其设定期望的方法。您想剔除您没有设置期望但测试通过所需的方法

3)需要传入所有参数

要修复,请在设置期望后创建 User 对象,并依次 stub 每个方法(因为您的模型调用 List.create 两次):

describe User do
describe "#setup_lists" do
it "creates a new master list" do
List.stub(:create).with(:user_id=>1,:name => "current")
List.should_receive(:create).with(:user_id=>1,:name => "master")
@user = User.create
end

it "creates a new current list" do
List.stub(:create).with(:user_id=>1,:name => "master")
List.should_receive(:create).with(:user_id=>1,:name => "current")
@user = User.create
end
end
end

虽然这确实是一个风格问题,但在这里使用真正的 User 对象而不是工厂更有意义,因为您正在测试模型本身。

关于unit-testing - 测试使用 after_create 回调的模型规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com