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])