ruby-on-rails - Rspec stub 不起作用

标签 ruby-on-rails ruby rspec

我有以下规范来测试 Controller 方法:

context "#create" do
  it "should redirect when model is valid" do
    User.stub!(:valid?).and_return(true)
    post :create, :user => FactoryGirl.attributes_for(:user)
    response.should redirect_to("/")
  end
  it "should render new template when model is invalid" do
    User.stub!(:valid?).and_return(false)
    post :create, :user => FactoryGirl.attributes_for(:user)
    response.should render_template(:new)
  end
end

和 Controller 本身:

def create
  @user = User.new(params[:user])
  if @user.save
    redirect_to "/", :notice => "User created"
  else
    render "new"
  end
end

相当简单的代码,但不知何故 stub!方法并没有真正 stub ,所以第二个规范失败了 expecting <"new"> but rendering with <""> .它只是像 valid? 一样重定向返回真。

我是 Rails 世界的新手。我错过了什么?谢谢。

最佳答案

保存对象时,Rails 会在类的实例上调用 valid?。但是您在类本身 上标记了valid?。那是行不通的。

您想在这里做的是在正在保存的用户的实例上 stub save,例如

User.stub(:new) { mock_model(User, :save => true) }

@user = User.new # @user 现在是一个模拟对象

@user.save # 模拟对象返回 true

另一个例子:

User.stub(:new) { mock_model(User, :save => false) }

@user = User.new # 同样,@user 是一个模拟

@user.save # 模拟对象返回 false

关于ruby-on-rails - Rspec stub 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9954801/

相关文章:

ruby-on-rails - 将源关键字和搜索关键字与帐户创建相关联

ruby-on-rails - 为什么在 Rails 中需要 binstubs?

ruby-on-rails - RSpec运行错误

ruby - initialize 方法是 Ruby 中的内置方法吗?

ruby - 针对特定规范关闭 VCR

ruby-on-rails - 必须手动将 'https://' 添加到 url

ruby-on-rails - I18n :Module 的未定义方法 `translate'

ruby-on-rails - Rails 4 Assets 管道抛出 "only generation of JSON objects or arrays allowed"

mysql - Rails 5 数据库迁移错误

c - Ruby/C/Makefile,-lpcap/#include <pcap.h> 中使用的默认 pcap.h 文件是什么