繁体   English   中英

如何在Rails测试环境中修补模型?

[英]How to monkeypatch a model in Rails test environment?

用例:在测试Oauth 2提供程序时,OAuth2 :: Client根据规范进行HTTP调用。

我使它起作用的唯一方法是使用RAILS_ENV=test rails s来启动Oauth 2提供程序的第二个实例。

Webmock无法正常工作,因为我想使用OAuth2 :: Client来测试Oauth 2提供程序以发出HTTP请求,而Capybara.run_server = true无法正常工作,因为它不响应HTTP请求。

我想为模型创建一个模拟,类似于RSpec模拟。 但是,启动第二个实例时,它不会加载RSpec模拟(或RSpec)。

因此,我发现的解决方案是在第二个实例中加载模型后对其进行猴子补丁。 我尝试更改config/environments/test.rb ,但是在加载模型后没有找到加载模拟的方法。

那么,在加载所有Rails模型之后,在测试环境中加载给定文件的好方法是什么?

Rails 4.1.6

使用Railtie 具体Railtie ::配置#after_initialize如果预先加载启用或Railtie ::配置#to_prepare如果模型是对每个请求重新加载。

class MyRailtie < Rails::Railtie
  # Executed after Rails is loaded. If Models are
  # eager loaded every model is defined here
  config.to_prepare do
    # Do monkey patching here.
    MyModel # Make sure Model is required
    class MyModel
    end
  end
end

摘要

我要掉2美分,希望您不要介意。

  1. 在编写集成测试时,您将自己限制在单元测试范围内。
  2. 尝试测试您对系统的期望,而不是期望系统如何完成繁重的工作。

不必要的限制

无需尝试避免在集成测试中遇到其他系统。

单元测试中要求使用特定的方法和数据进行请求,因为不应与系统的其他部分联系

在集成测试中,您没有此限制。 无需模拟或猴子补丁。 您正在测试系统,因为它将在生产环境中运行。 在集成测试中使用模拟实际上会降低测试套件的质量。

测试实际期望

我怀疑您不在乎OAuth :: Client做什么。 您可能不在乎OAuth服务器返回什么。 如果您使用的是OAuth和Doorkeeper,则它们已经过良好的测试,因此无需再次测试。

您可能关心的是能够使用从OAuth Provider获得的任何令牌访问受保护的资源。 让我们测试一下。

即使您尝试测试Doorkeeper本身,也不必担心可以隔离测试什么模型,测试从服务器返回的实际数据或期望它如何响应以下请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM