首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >instance_variable_set没有在实例中设置正确的变量

instance_variable_set没有在实例中设置正确的变量
EN

Stack Overflow用户
提问于 2018-04-17 07:26:22
回答 1查看 252关注 0票数 0

我有一个正在使用Ruby进行测试的API端点。我有8个测试,如下所示:

代码语言:javascript
复制
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时的时间戳数组。

代码语言:javascript
复制
RATE_LIMIT = RateLimit.new(5, 5.minutes)
post '/api/endpoint/' do
  if RATE_LIMIT.validate_rate?
    ...
  else
    throw Error
  end
end

RateLimit将包含以下@timestamp实例变量以及validate_rate?将与之进行比较的时间戳示例。

代码语言:javascript
复制
@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数组设置为一个新数组。

代码语言:javascript
复制
before do
  RateLimit.instance_variable_set(:@timestamp, [])
end

我现在遇到的问题是,因为RateLimit实例不是在这个测试中专门创建的,所以当我调用post /api/endpoint/时,如果这有意义的话,我似乎不能设置@timestamp变量。它确实将@timestamp设置为[],但没有设置我在运行实际测试时创建的特定实例

我想让@timestamp保持私有,所以我不想创建一个让我获取或设置这个私有变量的方法,所以我惟一的选择似乎是instance_variable_set

EN

回答 1

Stack Overflow用户

发布于 2018-04-17 16:05:03

您应该存根另一个方法:

代码语言:javascript
复制
before do
  allow_any_instance_of(RateLimit).to receive(validate_rate?).and_return(true)
end

然后在单独的测试用例中测试RateLimit.new

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49867625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档