你如何为self.method创建一个rspec测试?

时间:2013-03-29 17:17:28

标签: ruby-on-rails rspec

我目前在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) },但我认为自我的东西与身份验证不同。

我仍然是rails的初学者,我们非常感谢有关如何测试和解释self关键字的任何提示!

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

除了我对sytax的偏爱之外,我相信这比其他风格有两大优点:

  • 它可以更轻松地覆盖某些值(正如我上面使用password所做的那样)
  • 更重要的是,它强调了未经过测试的内容,例如空白密码,不存在的用户等

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