Capybara跳过控制器动作但仍然以适当的视图结束,因此测试通过

时间:2013-05-30 20:53:13

标签: ruby-on-rails cucumber capybara

这是我长期以来处理的最令人困惑的事情。我有一个控制器动作,在发表评论时发送电子邮件:

class CommentsController < ActionController::Base
  def create
    @comment = Comment.new(params[:comment])
    @comment.author = current_user
    @comment.save
    CommentMailer.recent_comment_made(@comment).deliver
    respond_with(@comment)
  end
end

我想测试一下。我的测试转到正确的页面(我已经验证了这一点),其中有一个带有操作/注释的表单。然后它提交表单并使用成功的闪存返回视图(使用FlashResponder),一切看起来都很棒......但是电子邮件永远不会被发送。实际上,从不调用整个create动作。奇怪的是同样的过程在开发中起作用但发送电子邮件!

现在我知道它正在找到正确的控制器,因为我可以添加它:

before_filter { raise }

测试失败了。我可以补充一下:

before_filter { p params }

我看到参数,控制器为“注释”,操作为“创建”。但是如果我补充一下:

def create
  raise
  ...

没有例外。事实上,我可以注释掉整个create方法,测试仍然会通过,并且会创建注释和所有内容。我没有使用InheritedResources或类似的任何东西。就像我说的......它适用于开发!

我在每一步之后都使用了save_and_open_page,这一切看起来都不错。表单操作是正确的。 flash消息是正确的。创建注释的断言是正确的......即使完全注释掉了create方法。

最初我认为这是错误的控制器,或者Cucumber因为某些未知原因使用了我的控制器的某些旧版本,但是当我添加before_filters来提升/打印参数时......所有这些都发生并按预期工作。

有谁知道这里会发生什么,或者我至少可以看到这里发生了什么?我完全没有想法。我的功能如下所示:

Given I visit the page
And I enter a comment
When I submit the comment
Then the e-mail is delivered
And the comment is saved to the database

这些比实际隐藏项目的实际意图更通用。步骤定义伪代码是:

visit ...
fill_in ...
find('submit button').click
assert ActionMailer::Base.deliveries.include? ...
assert comments.present?

非常简单的东西。访问页面,提交表单,声明创建操作中的内容有效。

1 个答案:

答案 0 :(得分:0)

... WOW

发生了什么事情是我们的api / v1目录中有一个控制器的副本(但未在api / v1中命名空间)。测试正在加载该版本,而开发正在加载“实际”版本。