【问题标题】:Rspec testing instance variables with user creationRspec 通过用户创建测试实例变量
【发布时间】:2012-10-29 20:58:31
【问题描述】:

我正在测试以确保将创建的用户分配给我的实例变量@user。我明白 get 是什么意思,但我不确定要为测试写什么。我返回错误 URI 或 URL 的参数错误。我的测试出了什么问题,我该如何解决?

it "checks @user variable assignment for creation" do

    p = FactoryGirl.create(:user)
    get :users
    # I'm confused on what this line above means/does. What does the hash :users refer 
    #to
    assigns[:user].should == [p]

end

expected URI object or string error指的是get :users,报错如下

Failure/Error get :users
ArgumentError:
  bad argument: (expected URI object or URI string)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 testing rspec factory-bot


    【解决方案1】:

    我猜你想要的是

    it "checks @user variable assignment for creation" do
        p = FactoryGirl.create(:user)
        get :show, id: p.id
        assigns(:user).should == p
    end
    

    您不确定的行检查用户 p 的显示视图中分配的变量 (@user) 的内容是否等于您刚刚创建的 p 用户 more information there

    【讨论】:

    • 它仍然给我一个 URI 错误。澄清一下,我想检查我在users/new 中创建的用户是否将其表单信息传输到users/creation 控制器中的变量@user
    • 我不确定我是否完全理解您要测试的内容,并且您得到的错误是合乎逻辑的,您可以给出的正确参数是:没有任何参数的索引,或者:编辑 & :show 使用 :id 参数,如我在答案中所示
    • 让我问你这个。 get 实际上是做什么的?我认为这将帮助我解决这个问题。至于我的测试,这就是我试图在1:02:00复制youtube.com/watch?v=05WQlbaRtm8&feature=relmfu
    • get 将在您当前正在测试的控制器上触发一个 get 请求,它将针对的操作是您传递给函数的第一个参数,更多信息在那里:api.rubyonrails.org/classes/ActionController/TestCase.html跨度>
    • 您要复制视频的哪一部分? (我不想看一小时的视频;))
    【解决方案2】:

    您要测试什么操作?通常,对于创建,您需要测试控制器的“创建”操作是否创建了一个用户并分配了一个 @user 变量

    我会这样测试:

    describe 'POST create' do
      it 'creates a user' do
        params = {:user => {:name => 'xxx', :lastname => 'yyy'}}
        User.should_receive(:create).with(params)
        post :create
      end
    
      it 'assigns the user to an @user instance variable' do
        user = mock(:user)
        User.stub!(:create => user)
        post :create
        assigns(:user).should == user
      end
    end
    

    请注意,我存根/模拟所有用户方法,因为您正在测试一个控制器,所以您不必真正创建用户,您只需测试控制器调用所需的方法,用户创建在用户模型中进行测试规格

    另外,我做了 2 次测试(如果可能的话,你应该在每个 it 块上只测试 1 件事,首先它测试控制器是否创建了一个用户,然后我测试控制器是否分配了变量

    我假设你的控制器是这样的:

    controller...
      def create
        @user = User.create(params[:user])
      end
    

    这太简单了,我猜你有更多代码,你也应该测试这些代码(验证、重定向、flash 消息等)

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多