首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模型中用RSpec & FactoryGirl测试rails类方法的正确方法是什么?

在模型中用RSpec & FactoryGirl测试rails类方法的正确方法是什么?
EN

Stack Overflow用户
提问于 2012-06-16 17:16:49
回答 1查看 2.4K关注 0票数 2

我必须测试一个类别rails模型,与rspec和工厂女孩隔离。我开始用FactoryGirl定义一个类别(记录),如下所示:

代码语言:javascript
复制
#spec/factories/category.rb
FactoryGirl.define do
  factory :category do |f|
    f.name "A/B Testing"
    f.tags_array %w(test a/b)
  end
end

和类别模型规范如下:

代码语言:javascript
复制
# spec/models/category_spec.rb
require 'spec_helper'

  describe "Category" do
    before(:each) do
      @category = FactoryGirl.create(:category)
    end
    it "has a valid factory" do
      @category.should be_valid
    end
    it "is invalid without a name" do
      @category.name = nil
      @category.should_not be_valid
    end
    it "is invalid without at last one tag" do
      @category.tags_array = nil
      @category.should_not be_valid
    end
  end

现在,我应该定义和测试一个类别类方法,它返回一个competitors数组,该是一个Struct对象,它是Struct对象,如下所示:

代码语言:javascript
复制
  Object.const_set :Competitor, Struct.new(:html_url, :description, :watchers, :forks)

然后,这个类方法seff.find_competitors_by_tags应该返回一个结构数组(竞争对手结构对象数组):

代码语言:javascript
复制
  def self.find_competitors_by_tags(tags_array)
    competitors = []
    Extractor.each do |wl|
      competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
    end
    return competitors
  end

用RSpec & FactoryGirl隔离测试这一点的最好方法是什么?我想到了以下几点,但我不能说清楚:

代码语言:javascript
复制
spec/factories/competitor.rb
FactoryGirl.define do
  factory :competitor do |f|
    f.html_url "https://github.com/assaf/vanity"
    f.description "Experiment Driven Development for Ruby"
    f.watchers "844"
    f.forks "146"
  end
end

# spec/models/category_spec.rb
require 'spec_helper'

  describe "Category" do
    ...
    ...

    it "returns a list of all competitors for each category" do
      competitors << FactoryGirl.create(:competitor) 
      competitors << Factory.build(:competitor, html_url: "https://github.com/andrew/split",
                                   description: "Rack Based AB testing framework",
                                   watchers: "357",
                                   forks: "42")
      @category.find_competitors_by_tags("A/B Testing").should == competitors
    end
  end

它无论如何都不起作用,我也不确定它是否有意义:

代码语言:javascript
复制
Failures:

      1) Category returns a list of all competitors for each category
         Failure/Error: @competitors << FactoryGirl.create(:competitor)
         NameError:
           uninitialized constant Competitor
         # ./spec/models/category_spec.rb:22:in `block (2 levels) in <top (required)>'

测试这种方法的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-16 21:09:28

您问过如何孤立地测试这一点:

代码语言:javascript
复制
 def self.find_competitors_by_tags(tags_array)
    competitors = []
    Extractor.each do |wl|
      competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
    end
    return competitors
  end

主要的问题是呼叫Extractor.each..。您应该将数组发送到此方法,并反转此依赖项。任何时候,您的方法都要自己获取信息,这就很难进行测试。所以就像这样:

代码语言:javascript
复制
def self.find_competitors_by_tags(extractions, tags_array)
  extractions.map do |wl|
    Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
  end
end

然后您就可以轻松地发送并测试它:

代码语言:javascript
复制
let(:extractions) {[ stub(:competitor), {html_url: "url", description: "description", watchers: "watchers", forks: "forks"] }

it "should map the extractions" do
  competitors = Class.find_competitors_by_tags(extractions, nil)
  competitors.first.html_url.should eq("url")
  #continue
end

最后注意:tags_array似乎未使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11065519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档