ruby-on-rails – Ruby新手的可变范围问题
我正在阅读“
Ruby on Rails 3 Tutorial”一书,并且遇到了我必须为静态页面编写一些基本单元测试的部分.我注意到代码只复制了一些文本,因此我将其更改为以下内容:
require 'spec_helper' describe PagesController do render_views pages = ['home','contact','about','help'] before(:each) do @base_title = "Ruby on Rails Tutorial Sample App | " end pages.each do |page| describe "GET '#{page}'" do it "should be successful" do get "#{page}" response.should be_success end it "should have the right title" do get "#{page}" response.should have_selector("title",:content => @base_title + page.capitalize) end end end end 我在上面的例子中感到困惑的是,我可以用这个替换’pages’变量: @pages = ['home','help'] 它仍然有效.这是为什么? ‘@pages’和’pages’有何不同? 另一个令人困惑的事情是,这两个导致测试失败: pages = ['home','help'] @base_title = "Ruby on Rails Tutorial Sample App | " 和 before(:each) do pages = ['home','help'] @base_title = "Ruby on Rails Tutorial Sample App | " end 为什么以上两个例子失败了?为什么代码看起来必须像我在第一个代码片段中发布的那样?我认为这与变量范围有关,但我仍然是Ruby的新手,所以我正在寻找更深入的理解. FWIW,我是一名经验丰富的C#开发人员,因此获得可比较的Java或C#代码将有助于我理解这个或写得很好的描述. 谢谢你的支持. 编辑: Failure/Error: response.should have_selector("title",:content => @base_title + page.capitalize) NoMethodError: You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.+ # ./spec/controllers/pages_controller_spec.rb:21:in `block (4 levels) in <top (required)>' 解决方法
K,我将按顺序回答你的问题……
1.当您进行更改时 pages = ['home','help'] 至… @pages = ['home','help'] 您只是将局部变量更改为实例变量…这应该不起作用,并且应该导致您的测试中断… 2.以下代码不起作用. pages = ['home','help'] @base_title = "Ruby on Rails Tutorial Sample App | " 这是因为@base_title将无法用于你的’it’“do”块.变量页面将在范围内……但是您有@base_title错误条件. 这也行不通. before(:each) do pages = ['home','help'] @base_title = "Ruby on Rails Tutorial Sample App | " end 此处定义的变量页面超出了您拥有的每个循环的范围. @base_title会很好,并且会完美地运用你的所有方法. – 结论 – 您发布的最终样本是正确的.您只需要每个循环的局部变量和一个实例变量(@base_title),以便在测试运行时它可用于整个实例化的类.希望这对你有所帮助.我建议在线查看其他一些ruby教程,我个人喜欢把人们送到http://rubykoans.com/ =) 最后一点,RSpec是一个复杂的范围,因为它使用了大量的块并且代码可以移动很多代码来完成它需要的工作.基本上你在街区内有块……事情很快就会变得棘手.我将从一些更简单的例子开始. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |