Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec模拟_模型在实例化对象中不可用?_Ruby On Rails_Rspec - Fatal编程技术网

Ruby on rails Rspec模拟_模型在实例化对象中不可用?

Ruby on rails Rspec模拟_模型在实例化对象中不可用?,ruby-on-rails,rspec,Ruby On Rails,Rspec,我在一个名为Project的模型中有这段代码。它在保存项目之前为项目设置所有者 before_save :set_owner # Set the owner of the project right before it is saved. def set_owner self.owner_id = mock_model(User).id # current_user.id is stubbed out for a mock_model. # Lifecycle is set by th

我在一个名为Project的模型中有这段代码。它在保存项目之前为项目设置所有者

before_save :set_owner

# Set the owner of the project right before it is saved.
def set_owner
  self.owner_id = mock_model(User).id # current_user.id is stubbed out for a mock_model.
  # Lifecycle is set by the form's collection_select
end
在我的Rspec测试中,当前的_用户函数被删除,以返回一个mock_模型(这就是为什么上面的代码显示的是mock_模型而不是当前的_用户)

现在,当我运行此程序时,我的Rspec测试中断,并抱怨:

undefined method `mock_model' for #<Project:0x105c70af0>
未定义的方法“mock_model”#
我的猜测是,因为在_save是一个实例函数之前,它不知何故认为mock_模型是一个在Project中定义的函数


一定有人以前遇到过这个。。。有什么办法可以解决吗?

两件事马上就突出了:

  • 您不应该在实际的项目模型中使用mock_模型。所有测试代码应保留在规范中

  • 不能将当前用户对象从控制器传递到模型(至少不能以任何方式传递)

  • 我会在项目模型中使用attr\u访问器来设置当前的用户id

    class Project < AR::Base
      attr_accessor :current_user
    
      def set_owner
        self.owner_id = current_user.id unless current_user.nil?
      end
    end
    

    除我的注释外:控制器中的my helper方法不能用于模型中的my before_save函数?即使我调用current_user,它也会给我一个错误,即未定义的局部变量或函数current_user在。模型的范围不包括我的应用程序控制器中的helper方法,嗯?我在实际的项目模型中没有使用mock_模型。我只是在那里写的,以避免混淆(基本上,这就是我的测试用它来替换实际代码的地方)。不过,attr_访问器不允许我使用helper方法。我的问题是,我如何获得实际的当前用户?我有点困惑,你想从哪里获得当前用户?您最初的问题似乎是问为什么在项目模型中有一个未定义的方法mock_模型。对不起,我的问题不清楚。当前用户是在我的应用程序控制器中定义的助手函数。所以实际上有两个问题。第一个是mock_模型不能从我的before_save回调中访问。第二个问题是当前用户无法从我的模型内部访问。在我的测试中,当前的_用户在调用mock_模型时被剔除,这一事实将两者联系在一起。因此,如果我让mock_模型在测试中工作,那么当前的_用户将无法在实现中工作。这更有意义吗?您不能在测试的类内部使用mock_模型。这是一个根本性的错误——换句话说,你做错了<代码>当前用户在您的模型中不可用,因为模型-视图-控制器模式的关注点分离。Beerlington的回答允许您从控制器(或从规范,如图所示)传入
    current\u user
    的值,以便正确设置项目。这是完成你想做的事情的唯一可行的方法。所以试试看,我想你会发现它是有效的:)
    it "should set the owner id" do
      user = mock_model(User)
      project = Project.new
      project.current_user = user
      project.save
      project.owner_id.should == user.id
    end