我应该如何测试邮件文件中的类对象?

时间:2011-09-29 21:13:27

标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec2

我正在使用Ruby on Rails 3.1.0,rspec-rails 2DelajdJob宝石。为了测试用户注册时是否发送了电子邮件,我正在尝试测试延迟的电子邮件,但我有一些麻烦\怀疑(与DelayedJob宝石没有直接关系)。

在我的控制器中我有:

def create
  ...
  Users::Mailer.delay.sign_up(@user)
  ...
end

在我的邮件文件中,我有:

class Users::Mailer
  def sign_up(user)
    @user = user

    # Note: 'authentication' refers to an associated model
    @authentication = user.authentication.user_token
    ...
  end
end

在我的spec文件中,我有:

describe "POST create" do
  it "sends e-mail" do
    post :create, { :email => 'foo@bar.com' }

    # Here I would like to test
    #  (1) if the e-mail is send
    #  (2) if the e-mail is send to the 'foo@bar.com' address
  end
end

如果我运行规范,我会收到以下错误:

Failure/Error: post :create,
NoMethodError:
  undefined method `user_token' for nil:NilClass

如何解决这个问题并测试电子邮件是否已发送?我应该模拟或存根用户类对象实例吗?你对我的建议有什么建议?

1 个答案:

答案 0 :(得分:0)

def create
    ... # whatever is going on here is not setting @user.authentication
    Users::Mailer.delay.sign_up(@user)
    ...
end

编辑:我意识到我回答了你遇到错误的问题。至于模拟用户对象,在这种情况下我会反对使用模拟。在这种情况下测试的重要性是发送了一封电子邮件,然后发送到foo@bar.com。我会发布您创建用户所需的内容,然后进行验证。