@depa 的答案很好,但为了替代方案,因为我更喜欢较短的语法:
describe User do
let(:user) { User.create(:email => email, :password => password) }
describe "Authentication" do
subject { User.authenticate(user.email, user.password) }
context "Given an existing user" do
let(:email) { "foo@bar.com" }
context "With a correct password" do
let(:password) { "foo" }
it { should eq(user) }
end
context "With an incorrect password" do
let(:password) { "bar" }
it { should be_nil }
end
end
end
end
除了我对语法的偏好之外,我相信这比其他风格有两个主要好处:
- 它使覆盖某些值变得更容易(正如我在
password
上面所做的那样)
- 更重要的是,它会突出显示未测试的内容,例如空白密码、不存在的用户等。
这就是为什么使用context
andsubject
和 and的组合let
对我来说远远优于通常的风格。