File: fake_ar_attributes.feature

package info (click to toggle)
ruby-bogus 0.1.5-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 828 kB
  • ctags: 628
  • sloc: ruby: 4,124; makefile: 6; sh: 2
file content (53 lines) | stat: -rw-r--r-- 1,855 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Feature: fake_ar_attributes

  Instances of ActiveRecord::Base subclasses are different then most of the objects you might encounter because the field access on those classes is done by taking advantage of Ruby's `method_missing` functionality.

  Unfortunately, in order to create a fake, Bogus has to examine all of the methods that are defined on a given class and herein lies the problem, the methods that you would expect to have on your ActiveRecord models do not exist:

      class BlogPost < ActiveRecord::Base
      end

      blog_post = BlogPost.new
      blog_post.respond_to?(:name) # => true
      blog_post.method(:name) # raises NameError

  Normally, this would prevent Bogus from being able to fake those methods, but in the case of ActiveRecord we can figure out those fields by looking at the `BlogPost.columns` property. Based on that we can define those accessors on the created fake. If you wish to take advantage of that, you just need to flip a configuration switch:

      Bogus.configure do |c|
        c.fake_ar_attributes = true
      end

  Scenario: Adding missing accessors to AR classes
    Given a file named "blog_post.rb" with:
    """ruby
    require 'active_record'
    require 'nulldb'

    ActiveRecord::Schema.verbose = false
    ActiveRecord::Base.establish_connection :adapter => :nulldb

    ActiveRecord::Schema.define do
      create_table :blog_posts do |t|
        t.string :name
        t.string :tags
      end
    end

    class BlogPost < ActiveRecord::Base
    end

    Bogus.configure do |c|
      c.fake_ar_attributes = true
    end
    """

    Then the following test should pass:
    """ruby
    require_relative 'blog_post'

    post = fake(:blog_post, name: "the name")
    stub(post).tags { "foo, bar" }

    expect(post.name).to eq("the name")
    expect(post.tags).to eq("foo, bar")
    """