gpt4 book ai didi

ruby-on-rails - 如何为这个公共(public)方法编写规范(使用 RSpec)?

转载 作者:行者123 更新时间:2023-11-28 20:33:10 25 4
gpt4 key购买 nike

我写了下面的类:

# This class is responsible for getting the data to create the sitemap
class City
attr_accessor :country_version, :directory, :country_host, :locale

def initialize(country_version, directory, country_host,locale)
@country_version = country_version
@directory = directory
@country_host = country_host
@locale = locale
end

def get_data
::City.find_each(:conditions => {:country_version_id => @country_version.id}) do |city|
I18n.locale=(@locale)
yield entry(city)
end
end

private

def entry(city)
{
:loc => ActionController::Integration::Session.new.url_for(
:controller => 'cities',
:action => 'show',
:city_name => city.name,
:host => @country_host.value),
:changefreq => 0.8,
:priority => 'monthly',
:lastmod => city.updated_at
}
end
end

我正在使用 RSpec 为此类编写规范。到目前为止,我的规范涵盖了访问器方法和构造函数。然而,当涉及到更复杂的方法 get_data 时,我迷路了。有人可以给我一些提示,告诉我如何解决为该方法编写规范的问题吗?

最佳答案

一个简单的测试肯定会遵循以下原则:

  • 它会在实例化时爆炸吗?
  • 在给出好的参数时它会返回数据吗?
  • 当给出错误的参数或导致没有结果的参数时,它是否返回我期望的结果(零/零/异常?)?

部分代码:

describe :City do
let(:country_version) { 123412 }
# other useful args here
context "On instantiation" do
context "Given valid arguments" do
subject { City.new country_version, ...}
it { should_not be_nil }
it { should be_a_kind_of City }
end
end
end
context "Given a country version id" do
context "that is valid" do
context "and records exist for in the datastore"
let(:city) { City.new country_version, ...}
subject { city.get_data }
it { should_not be_nil }
it { should be_a_kind_of... (Array, Hash?) }
it { should include( ...? }
end
end
end
end

显然,这是行不通的,因为我不知道应该进出什么,但它给了你一些可以继续的东西,它也暗示了一些缺失的规范(比如无效的参数等等)第四)

参见 https://www.relishapp.com/rspec/rspec-expectations了解更多。

这里的一些评论也是正确的,你可能在某些时候需要模拟,而且你可能确实需要重构这个方法,所以发布到代码风格论坛可能也是一个主意。

关于ruby-on-rails - 如何为这个公共(public)方法编写规范(使用 RSpec)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8730279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com