我做了一个简单的测试,
it "should return list of invoices for a certain taxi driver" do
taxi_driver=TaxidriverController.new();
invoice=taxi_driver.getInvoices("T2")
res=[{ passenger: "Salman", Origin:"Liivi 2, Tartu, Estonia",Destination:" Uus-Sadama 25, Tallinn, Estonia", Price:"1000"}]
expect(invoice).to eq(res)
end
在我的控制器中我有:
class TaxidriverController < ApplicationController
def getInvoices( taxi_No )
[{ passenger: "Salman", Origin:"Liivi 2, Tartu, Estonia",
Destination:" Uus-Sadama 25, Tallinn, Estonia", Price:"1000"}]
end
end
如您所见,该方法未实现,我只是想确保我可以通过此返回类型传递测试。但我遇到了错误
ArgumentError:
wrong number of arguments (0 for 1)
# ./app/controllers/taxidriver_controller.rb:15:in `getInvoices'
答案 0 :(得分:0)
您不应直接调用控制器上的方法。
Rails控制器的公共API是响应HTTP请求的操作。其他一切都应该是私人方法。而且你不测试私有,因为它是一个实现细节。
您的控制器规格将测试您的控制器如何响应某个请求以及它给出的响应。您从不实例化控制器。
那么呢?
此功能听起来像属于模型层的东西。我们可以直接测试模型:
class TaxiDriver < ActiveRecord::Base
# methods in ruby should be snake_case.
def get_invoices
# ...
end
end
require 'rails_helper'
RSpec.describe TaxiDriver do
let(:taxi_driver) { TaxiDriver.new }
describe '.get_invoices' do
it "should return list of invoices for a certain taxi driver" do
res = [{ passenger: "Salman", Origin:"Liivi 2, Tartu, Estonia",Destination:" Uus-Sadama 25, Tallinn, Estonia", Price:"1000"}]
expect(taxi_driver.get_invoices("T2")).to eq(res)
end
end
end
不属于可以分解为零件并单独测试的模型中的任何其他内容属于帮助程序或服务对象。