6

我目前在我的User课堂上有这个方法:

def self.authenticate(email, password)
  user = User.find_by_email(email)
  (user && user.has_password?(password)) ? user : nil
end

如何对此进行 rspec 测试?

我试图运行it { responds_to(:authenticate) },但我认为 self 的东西与身份验证不同。

我仍然是 Rails 的初学者,任何有关如何测试和解释self关键字的提示将不胜感激!

4

2 回答 2

5
describe User do
  let(:user) { User.create(:email => "foo@bar.com", :password => "foo") }

  it "authenticates existing user" do
    User.authenticate(user.email, user.password).should eq(user)
  end

  it "does not authenticate user with wrong password" do
    User.authenticate(user.email, "bar").should be_nil
  end
end
于 2013-03-29T17:28:10.293 回答
1

@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上面所做的那样)
  • 更重要的是,它会突出显示测试的内容,例如空白密码、不存在的用户等。

这就是为什么使用contextandsubject和 and的组合let对我来说远远优于通常的风格。

于 2013-03-29T17:56:03.617 回答