【问题标题】:How to test Application_Controller that creates instance variables如何测试创建实例变量的 Application_Controller
【发布时间】:2016-04-17 12:44:33
【问题描述】:

我的应用程序控制器如下所示:

class ApplicationController
  before_action :set_customer

  def customer?
    @customer.nil?
  end

  private
    def set_customer
       if request.host != "example.com"
          @customer = Customer.find_by_domain("...")
       else
         if request.subdomain != "www"
           @customer = Customer.find_by_sub("...")
         end
       end
    end    


end

如何对 ApplicationController 进行测试?

我想传入 URL,然后检查 @customer 是否为 nil 等。

例如要测试的 URLs

example.com
www.example.com
google.com
hello.example.com

【问题讨论】:

标签: ruby-on-rails rspec


【解决方案1】:

您不应该测试实例变量。如果需要,将代码移动到服务对象。

assigns 将在 Rails 5 中被弃用,因此可能会在某个时候被删除。在控制器测试中,您希望根据您的用户(身份验证)和授权检查响应是否符合您的预期(响应代码),并且可能使用了正确的格式。

在另一个测试(“视图”测试,我的意思是集成测试)中,您还要检查视图中的输出是否包含基于您的实例变量的一些值。

在这种情况下,您可以根据您的子句简单地测试服务调用Customer.find_by_sub(或by_domain),这就是您需要测试的全部,实例变量不应该是您关心的东西。

【讨论】:

  • 我明白你的意思,但我有寻找我必须测试的 request.host 或 request.subdomain 的逻辑。我无法将其包装到另一种方法中,因为我有时使用 request.host 有时使用 request.subdomain。
  • 您可以创建一个服务对象并在那里传递请求并通过那里处理所有事情。存根 hostsubdomain 也会更容易,因为您可以传递一个模拟对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2011-10-20
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多