gpt4 book ai didi

ruby-on-rails - : rspec stub(:new). 这里发生了什么......?

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

我对 rspec 生成的脚手架 Controller 规范发生了什么感到有些困惑。在我为我的应用程序添加授权之前,这似乎很有意义,现在我需要更新我的测试。

MyClass.stub(:new).with('these' => 'params') { mock_my_class(:save => true) }

在我的 Controller 中,我在创建新记录时将哈希合并到 params 中(它需要 current_user id 有效)。 MyClass.new(params[:my_class].merge(:user_id => current_user.id))

测试失败
expected: ({"these"=>"params"})
got: ({"these"=>"params", "user_id"=>315})

测试失败是有道理的,因为新方法收到了它意想不到的参数。它期望收到 {'these' => 'params'} 但它实际上收到了 {'these' => 'params', 'user_id' => 1234}

所以我的自然 react 是调整测试,因为新方法应该接收 {'these' => 'params', 'user_id' => 1234} 并返回模拟对象。

所以我添加到测试如下:
   MyClass.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_my_class(:save => true) }   

这是我被抛出一个循环的地方。测试结果如下:
expected: ({"these"=>"params", "user_id"=>298})
got: ({"these"=>"params"})

似乎成功的测试正在神奇地避开我。我确信这些结果有一个合乎逻辑的原因,但我似乎无法弄清楚。

有什么帮助吗? :)

笔记:

rspec 站点说明如下:
Account.should_receive(:find).with("37").and_return(account)

或者
Account.stub!(:find).and_return(account)

这很容易遵循它只是看起来很奇怪,生成的脚手架不包含这些方法(除非我搞砸了一些可能的东西(:)

通行证
login_admin
describe "with valid params" do
it "assigns a newly created forum_sub_topic as @forum_sub_topic" do
ForumSubTopic.stub(:new) { mock_forum_sub_topic(:save => true) }
ForumSubTopic.should_receive(:new).with({"these"=>"params", "user_id"=> @admin.id}) #PASS!
post :create, :forum_sub_topic => {'these' => 'params'}
assigns(:forum_sub_topic).should be(mock_forum_sub_topic) #PASS!
end
end

失败
login_admin
describe "with valid params" do
it "assigns a newly created forum_sub_topic as @forum_sub_topic" do
ForumSubTopic.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_forum_sub_topic(:save => true) }
post :create, :forum_sub_topic => {'these' => 'params'}
assigns(:forum_sub_topic).should be(mock_forum_sub_topic)
end
end

最佳答案

俗话说“永远不要相信瘾君子”。也可以说,“永远不要相信脚手架”。

好吧,这有点太苛刻了。脚手架尽力找出哪些参数适用于您正在生成的模型/ Controller ,但它不知道嵌套资源(这是我假设您正在使用的资源),因此它不会生成 user_id参数哈希。补充一点:

post :create, :forum_sub_topic => {:user_id=>@user.id}

生成 these_params key 作为示例 - 删除它并添加 Controller 所需的任何参数以创建 MyClass

关于 with 选项: stubshould_receive 只会剔除满足指定条件的消息,即如果你这样做:
MyClass.stub(:new) {mock_model(MyClass,:save=>true)}

然后 MyClass 将使用模拟响应任何 new 消息。另一方面,如果你这样做:
MyClass.stub(:new).with({:bogus=>37}) {mock_model(MyClass,:save=>true)}

然后,当 MyClass 也接收 new 作为参数时,它只会响应 {:bogus=>37}

关于ruby-on-rails - : rspec stub(:new). 这里发生了什么......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012952/

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