我有一个案例,我有一个基于该类是否包含模块的类可用的类方法。例如:
class HomePage
include Symbiont
url_matches 'test'
end
class WeightPage
include Symbiont
end
这里包含Symbiont时,它提供了一个名为url_matches
的类方法。但请注意,您不必使用它,如WeightPage所示。因此,虽然Symbiont使该方法可用,但包含Symbiont的类不必使用它。
以下是问题: 我想要做的是检查班级是否实际上正在使用它。
但我无法弄清楚如何。所以,让我们这样说:
@home = HomePage.new
@weight = WeightPage.new
我希望能够做到这样的事情:
@home.respond_to?(:url_matches) # should return true
@weight.respond_to?(:url_matches) # should return false
这不起作用。两者都返回假。然后我在课堂上尝试了它:
@home.class.respond_to?("url_matches")
@weight.class.respond_to?("url_matches")
然而,总是会返回true。
我试过了:
@home.class.public_instance_methods.include?(:url_matches)
@weight.class.public_instance_methods.include?(:url_matches)
始终返回false。
@home.class.method_defined?(:url_matches)
@weight.class.method_defined?(:url_matches)
始终返回false。
此时,我不知道该怎么做。
基础代码背景
出于这个问题的目的,上下文中的代码可能有点难以理解,但只是提供它:
这是" Symbiont"包含的模块:
https://github.com/jnyman/symbiont/blob/master/lib/symbiont.rb
特别注意这一部分:
module Symbiont
def self.included(caller)
caller.extend Symbiont::Assertion
Symbiont :: Assertion就在这里:
https://github.com/jnyman/symbiont/blob/master/lib/symbiont/assertions.rb
这就是url_matches
的来源。因此,当Symbiont包含在类中时,如前所示,这是允许在类上声明url_matches
的原因。
答案 0 :(得分:1)
只需将url_matches
添加到这两个类中,即可将Symbiont
方法添加到这两个类中。
那说:如果该类响应该方法,但是如果该方法被调用,则您不感兴趣。如果您查看implementation of that method,您会看到该方法设置了@url_match
变量。因此,您的问题应该是:@url_match
变量是否已设置?
这可以通过使用instance_variable_get
:
@home.class.instance_variable_get(:@url_match)
@weight.class.instance_variable_get(:@url_match)
答案 1 :(得分:0)
怎么样?
expect(HomePage).to respond_to(:url_matches)
答案 2 :(得分:0)
我的2美分:我想我会修补backend fail_be {
.host = "127.0.0.1";
.port = "9000";
.probe = {
.url = "/give-me-a-non-200-please";
.interval = 24h;
.timeout = 1s;
.window = 1;
.threshold = 1;
}
}
sub vcl_recv {
# Force the non-healthy backend in case of restart because of a previous
# failed backend fetch. This will force serving stalled content using
# full grace during 'vcl_hit' (if possible).
if (req.restarts == 0) {
unset req.http.X-Varnish-Restarted-5xx;
} else {
if (req.http.X-Varnish-Restarted-5xx) {
set req.backend_hint = fail_be;
}
}
# ...
}
sub vcl_synth {
# 503 generated for synchronous client requests when abandoning the
# backend request (see 'vcl_backend_fetch') and not executing a POST.
if (resp.status == 503 &&
req.method != "POST" &&
!req.http.X-Varnish-Restarted-5xx) {
set req.http.X-Varnish-Restarted-5xx = "1";
return (restart);
}
# ...
}
sub vcl_backend_fetch {
if (bereq.retries == 0) {
unset bereq.http.X-Varnish-Backend-5xx;
} else {
if (bereq.http.X-Varnish-Backend-5xx) {
# Jump to 'vcl_synth' with a 503 status code.
return (abandon);
}
}
# ...
}
sub vcl_backend_response {
if (beresp.status >= 500 && beresp.status < 600) {
set bereq.http.X-Varnish-Backend-5xx = "1";
return (retry);
}
# ...
}
sub vcl_backend_error {
set bereq.http.X-Varnish-Backend-5xx = "1";
return (retry);
}
方法,以便在调用时将类变量url_matches
设置为@@symbiont_enabled
,然后我会添加另一个类方法,看起来像这样:
true