有没有办法强制RSpec重新评估let语句?

时间:2013-04-02 17:29:27

标签: ruby rspec tdd bdd

这个例子有点人为,但很好地解释了用例。

let( :number_of_users ){ User.count }

it 'counts users' do
  User.create
  number_of_users.should == 1
  User.create
  number_of_users.should == 2
end

此测试失败,因为number_of_users仅评估一次,并且变得陈旧。有没有办法在每次调用它时重新评估它?

4 个答案:

答案 0 :(得分:10)

您可以定义常规方法:

def number_of_users
  User.count
end

it 'counts users' do
  User.create
  number_of_users.should == 1
  User.create
  number_of_users.should == 2
end

有关更多详细信息,请参阅此blog post,包括如何将帮助程序方法存储在单独的模块中。

答案 1 :(得分:3)

如何写这样的测试:

it "counts user" do
  expect {
    User.create
  }.to change(User, :count).by(1)
end

答案 2 :(得分:1)

简短回答“不”(AFAIK)

如果你的方法或对象有一个有用的容器,你可能会通过为其分配一个变量来获得一些东西。

比你的例子更加做作:

let( :user_module ){ User }

it 'counts users' do
  User.create
  user_module.count.should == 1
  User.create
  user_module.count.should == 2
end

答案 3 :(得分:0)

您也可以使用proc

let( :number_of_users ){ proc { User.count } }

it 'counts users' do
  User.create
  number_of_users.call.should == 1
  User.create
  number_of_users.call.should == 2
end