Minitest:如何测试方法

时间:2016-06-30 13:30:02

标签: ruby sinatra minitest

我正在尝试在我的代码中测试该方法,但第二个测试是返回错误undefined local variable or method 'params'

测试方法的正确方法是什么?或者我需要对main.rb如何设置进行更改?

代码:

require 'sinatra'
require 'sinatra/reloader'


def get_products_of_all_ints_except_at_index()
  @array = [1, 7, 3, 4]
  @total = 1
  @index = params[:index].to_i
  @array.delete_at(@index)
  @array.each do |i|
    @total *= i
  end
end



get '/' do
  get_products_of_all_ints_except_at_index
  erb :home
end

试验:

ENV['RACK_ENV'] = 'test'

require 'minitest/autorun'
require 'rack/test'

require_relative 'main.rb'

include Rack::Test::Methods

def app
  Sinatra::Application
end

describe 'app' do
  it 'should return something' do
    get '/'
    assert_equal(200, last_response.status)
  end

  it 'should return correct result' do
    get_products_of_all_ints_except_at_index
    assert_equal(24, @total)
  end
end

2 个答案:

答案 0 :(得分:1)

您没有通过获取请求传递任何参数,请尝试:

get '/', :index => '1'

答案 1 :(得分:0)

第一次测试有效,因为在调用params时,您有一个默认的get '/'地图设置。但是,当您直接调用该方法时,paramsnil,这就是您收到错误的原因。这里最好的方法是将您需要的数据发送给您方法。类似的东西:

def get_products_of_all_ints_except_at_index index
  @array = [1, 7, 3, 4]
  @total = 1
  @array.delete_at(index)
  @array.each do |i|
    @total *= i
  end
end

get '/' do
  get_products_of_all_ints_except_at_index params[:index].to_i
  erb :home
end

在代码的最外层通常可以查找请求中的内容。那么业务代码也将获得更高的可测试性!