在rspec测试中创建一个对象变量但是没有

时间:2013-04-03 07:32:28

标签: ruby-on-rails rspec

这是我的rspec代码:

describe User do
  before{(@user=User.new(username:"abcdefg",email:"123456@123.com",password:"123456")}
  subject(@user)
  @user.save
end

我收到了这样的错误:undefined method 'save' for nil:NilClass(NoMethodError)

我尝试在rails控制台中编写相同的代码,它只是起作用。但是当谈到Rspec时,它失败了,我找不到任何理由......

有人可以帮我吗?

2 个答案:

答案 0 :(得分:6)

这是Rspec方式:

describe User do
  let(:valid_user) { User.new(username:"abcdefg",email:"123456@123.com",password:"123456") }

  it "can be saved" do
    expect(valid_user.save).to be_true
  end
end

请注意,您应该避免在规范中使用数据库操作,这是使它们变慢的原因。

另一点,请考虑使用工厂来清理您的规格。

答案 1 :(得分:5)

您需要将代码包装在示例块中(即,使用块调用it方法),因为在describe块的上下文中,@user未定义。例如:

describe User do
  before{(@user=User.new(username:"abcdefg",email:"123456@123.com",password:"123456")}
  subject(@user)

  it "can be saved" do
    @user.should respond_to(:save)
    @user.save.should_not be_false
  end
end

编辑:我还注意到您有subject(@user)但可能需要一个块才能正确设置。以下是整体清洁:

describe User do
  let(:user) { User.new(username:"abcdefg",email:"123456@123.com",password:"123456") }

  it "can be saved" do
    user.should respond_to(:save)
    user.save.should_not be_false
  end
end