我有一个正在使用Ruby进行测试的API端点。我有8个测试,如下所示:
it "must rate limit on this api" do
body = {
..
}
# Current limits assigned to this api endpoint are 5 requests every 5 minutes.
# So this test will make 5 calls in short succession to trigger the rate limiter
with_logging_suppressed do
5.times do
post '/api/endpoint/', body.to_json
last_response.status.must_equal 200
end
post '/api/endpoint/', body.to_json
last_response.status.must_equal 429
last_response.body.include? "You are doing this too often"
end
end当您发布到/api/endpoint/时,它会生成一个包含validate_rate?方法的RateLimit类,并使用@timestamp的实例变量,该变量是调用该API时的时间戳数组。
RATE_LIMIT = RateLimit.new(5, 5.minutes)
post '/api/endpoint/' do
if RATE_LIMIT.validate_rate?
...
else
throw Error
end
endRateLimit将包含以下@timestamp实例变量以及validate_rate?将与之进行比较的时间戳示例。
@timestamp = [2018-04-16 19:17:48 -0400, 2018-04-16 19:17:49: -0400, 2018-04-16 19:17:58 -0400]但是,在每次测试运行之前,我必须清除@timestamp数组,否则该数组将包含以前测试的时间戳,这当然会破坏测试结果
因此,在每次以before块的形式运行测试之前,我尝试将@timestamp数组设置为一个新数组。
before do
RateLimit.instance_variable_set(:@timestamp, [])
end我现在遇到的问题是,因为RateLimit实例不是在这个测试中专门创建的,所以当我调用post /api/endpoint/时,如果这有意义的话,我似乎不能设置@timestamp变量。它确实将@timestamp设置为[],但没有设置我在运行实际测试时创建的特定实例
我想让@timestamp保持私有,所以我不想创建一个让我获取或设置这个私有变量的方法,所以我惟一的选择似乎是instance_variable_set。
发布于 2018-04-17 16:05:03
您应该存根另一个方法:
before do
allow_any_instance_of(RateLimit).to receive(validate_rate?).and_return(true)
end然后在单独的测试用例中测试RateLimit.new
https://stackoverflow.com/questions/49867625
复制相似问题