Ruby on rails 为什么我的RubyonRails RSpec测试同时通过@plugin和@plugins测试? 我在《基础铁路》2章的第10章。我们正在与RSpec合作
我们正在测试“插件控制器”的“索引”操作 以下是控制器的代码:Ruby on rails 为什么我的RubyonRails RSpec测试同时通过@plugin和@plugins测试? 我在《基础铁路》2章的第10章。我们正在与RSpec合作,ruby-on-rails,rspec,Ruby On Rails,Rspec,我们正在测试“插件控制器”的“索引”操作 以下是控制器的代码: class PluginsController < ApplicationController # GET /plugins # GET /plugins.xml def index @plugins = Plugin.find(:all) respond_to do |format| format.html # index.ht
class PluginsController < ApplicationController
# GET /plugins
# GET /plugins.xml
def index
@plugins = Plugin.find(:all)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @plugins }
end
end
当我们写测试的时候,我想这行
Plugin.should_receive(:find).with(:all).and_return([@plugin])
应该有
@plugins
而不是
@plugin
因为在控制器中我们有
def index
@plugins = Plugin.find(:all)
我想看看如果我改变了会发生什么
Plugin.should_receive(:find).with(:all).and_return([@plugin])
到
测试通过了
那么…为什么是@plugin而不是@plugins呢?还有…为什么这两个测试都通过了
干杯 当您有一个未定义的变量时,如@plugins,因为您在测试之前没有定义它,它将显示为nil
在这种情况下,
Plugin.find(:find).with(:all.)和[u return([@plugins])
实际做的是告诉Plugin.find(:all)
返回[nil]
,根据您的测试,这是有效的。好的,这是有意义的。谢谢,吉米。不过,我还是想知道……在“PluginsController”中,我们有def index@plugins=Plugin.find(:all),那么为什么不在测试中使用@plugins呢?为什么我们在@plugin=mock_模型(plugin)中使用@plugin?好吧,这取决于你。它只是测试中使用的一个实例变量,因此您可以选择所需的名称。也许更好的名字应该是@mocked\u plugin
。我猜他们之所以在书中称它为@plugin
而不是@plugins
,是因为它不是一个mock数组(只有一个实例,因此没有复数)
Plugin.should_receive(:find).with(:all).and_return([@plugin])
Plugin.should_receive(:find).with(:all).and_return([@plugins])