我想知道方法和rspec里面的定义描述块吗?我为什么要使用let而不是def?
let(:create_user) { post :create }
Vs的
def create_user
post :create
end
在测试中,两种方式似乎都是一样的:
expect { create_user }.to change { User.count }.by(1)
答案 0 :(得分:5)
不确定这是否是唯一的区别,但let
会记住它的价值。所以它会更接近:
def create_user
@_create_user ||= post :create
end
答案 1 :(得分:4)
通常,您会对正在测试的某种值使用let
定义(例如let(:apple) { 2 + 3 }
)。关于let
的另一个重要事项是它使用了memoization。这意味着一旦你为let子句调用了名字,结果就会被缓存而不再计算(apple
变为5而2 + 3
永远不再计算)。
您通常会使用def
来定义方法。在规范中,通常使用方法在测试之间共享通用逻辑,例如规范的复杂设置。
let
还有另一个有用的属性 - 您可以使用其同义词subject
来帮助您缩短specs。
答案 2 :(得分:1)
另一个重要区别是您可以将参数传递给方法,但不能传递给let
。