【问题标题】:Specing a manual call to valid?指定手动调用有效?
【发布时间】:2009-05-31 16:00:15
【问题描述】:

大家好,我完全迷失了这个。

我在网上找到了一个代码 sn-p,以帮助在用户输入字段时通过 ajax 验证字段。所以我正在尝试针对其中的一部分编写规范,但我无法让它通过。

这是代码

def validate
  field = params[:field]
  user = User.new(field => params[:value])
  output = ""
  user.valid?
  if user.errors[field] != nil
    if user.errors[field].class == String
      output = "#{field.titleize} #{user.errors[field]}" 
    else
      output = "#{field.titleize} #{user.errors[field].to_sentence}" 
    end
  end
  render :text => output
end

这是我目前的测试

  describe "POST validate" do
    it "retrieves the user based on the past in username" do
      mock_errors ||= mock("errors")
      mock_errors.stub!(:[]).and_return(nil)
      User.should_receive(:new).with({'username'=>"UserName"}).and_return(mock_user)
      mock_user.should_receive(:valid?).and_return(true)
      mock_errors.should_receive(:[]).with("username").and_return(nil)
      put :validate, :field=>'username', :value=>'UserName'      
      response.should == ""
    end
  end

我收到此错误 -

1) Spec::Mocks::MockExpectationError 在 'UsersController POST 验证 根据过去检索用户 在用户名'模拟'错误'收到 意外消息:[] 与 (“用户名”)

我似乎无法弄清楚如何模拟对 user.errors[field] 的调用。理想情况下,此规范测试快乐的路径,没有错误。然后我会为验证失败写另一个。

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    我没有看到 mock_user。这是一个镜头:

    describe "POST validate" do
      it "retrieves the user based on the past in username" do
        mock_errors = mock("errors")
        mock_user = mock("user")
        mock_user.stub!(:errors).and_return([mock_errors])
        mock_errors.stub!(:[]).and_return(nil)
        User.should_receive(:new).with({'username'=>"UserName"}).and_return(mock_user)
        mock_user.should_receive(:valid?).and_return(true)
        mock_errors.should_receive(:[]).with("username").and_return(ActiveRecord::Errors.new({}))
        put :validate, :field=>'username', :value=>'UserName'      
        response.should == ""
      end
    end
    

    关键是您需要您的用户模拟通过返回空哈希或字段名/错误的哈希来响应错误方法。对此的替代方法是使用其中一种夹具更换工具。我现在正在使用机械师,这可能会将整个事情简化为:

    describe "POST validate" do
      it "retrieves the user based on the past in username" do
        @user = User.make{'username'=>"UserName"}
        @user.should_receive(:valid?).and_return(true)
        @user.errors.should_receive(:[]).with("username").and_return(ActiveRecord::Errors.new({}))
        put :validate, :field=>'username', :value=>'UserName'      
        response.should == ""
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多