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

Rya*_*Zhu 4 rspec ruby-on-rails

这是我的rspec代码:

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

我有这样一个错误: undefined method 'save' for nil:NilClass(NoMethodError)

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

任何人都可以帮助我吗?

apn*_*ing 7

这是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
Run Code Online (Sandbox Code Playgroud)

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

另一点,考虑使用工厂来清理你的规格.


Stu*_*t M 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
Run Code Online (Sandbox Code Playgroud)

编辑:我也注意到你有,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
Run Code Online (Sandbox Code Playgroud)