[英]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美分,希望您不要介意。
无需尝试避免在集成测试中遇到其他系统。
单元测试中要求使用特定的方法和数据进行请求,因为不应与系统的其他部分联系
在集成测试中,您没有此限制。 无需模拟或猴子补丁。 您正在测试系统,因为它将在生产环境中运行。 在集成测试中使用模拟实际上会降低测试套件的质量。
我怀疑您不在乎OAuth :: Client做什么。 您可能不在乎OAuth服务器返回什么。 如果您使用的是OAuth和Doorkeeper,则它们已经过良好的测试,因此无需再次测试。
您可能关心的是能够使用从OAuth Provider获得的任何令牌访问受保护的资源。 让我们测试一下。
即使您尝试测试Doorkeeper本身,也不必担心可以隔离测试什么模型,测试从服务器返回的实际数据或期望它如何响应以下请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.