Методы модели Rspec возвращают nil при создании с помощью let

Итак, это может показаться полным вопросом новичка, но когда я создаю экземпляр моей модели с let, по какой-то причине все методы получения на нем возвращают nil. Вот мой пример:

Модель:

class Parcel < ActiveRecord::Base
  extend UUIDHelper

  serialize :address, ActiveRecord::Coders::Hstore

  self.rgeo_factory_generator = RGeo::Geographic.spherical_factory srid: 3785

  attr_accessible :address, :area_poly, :id, :lonlat, :municipal_id
end

Спецификация:

require 'spec_helper'
require 'street_address'

describe Parcel do
  let(:geo_factory) { RGeo::Geographic.spherical_factory(srid: 3785)}
  let(:point1) {geo_factory.point(-72.9229165, 41.3096987)}
  let(:point2) {geo_factory.point(-72.9229169, 41.3096987)}
  let(:point3) {geo_factory.point(-72.9229169, 41.3096983)}
  let(:point4) {geo_factory.point(-72.9229165, 41.3096983)}
  let(:line_string) {geo_factory.line_string([point1,point2,point3,point4])}
  let(:polygon) {geo_factory.polygon(line_string)}
  let(:parcel) { Parcel.create(
      municipal_id: 'abc123',
      area_poly: polygon,
      #lonlat: polygon.centroid,
      address: StreetAddress::US.parse('55 Whitney Ave New Haven, CT 06510').as_json
  )}

  it "#municipal_id should not be nil" do
    parcel.municipal_id.nil? should_not be_true
  end
end

(атрибут #longlat закомментирован, потому что вызов метода .centroid для сферически определенного полигона в RGeo — нет-нет. Получение правильной проекции, хотя и в моем списке дел, не имеет отношения к этому вопросу) И спецификация терпит неудачу так:

expected: non-true value
  got: #<Parcel id: nil, municipal_id: nil, address: {}, created_at: nil, updated_at: nil, area_poly: nil, lonlat: nil>

FWIW, вот журнал Rspec:

Connecting to database specified by database.yml
   (0.1ms)  BEGIN
   (7.2ms)  SELECT * FROM geometry_columns WHERE f_table_name='parcels'
   (0.1ms)  SAVEPOINT active_record_1
  SQL (4.2ms)  INSERT INTO "parcels" ("address", "area_poly", "created_at", "id", "lonlat",     "municipal_id", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7)  [["address", "\"number\"=>\"55\",\"street\"=>\"Whitney\",\"street_type\"=>\"Ave\",\"unit\"=>NULL,\"unit_prefix\"=>NULL,\"suffix\"=>NULL,\"prefix\"=>NULL,\"city\"=>\"New Haven\",\"state\"=>\"CT\",\"postal_code\"=>\"06510\",\"postal_code_ext\"=>NULL"], ["area_poly", #<RGeo::Geographic::SphericalPolygonImpl:0x80b773e0 "POLYGON ((-72.9229165 41.3096987, -72.9229169 41.3096987, -72.9229169 41.3096983, -72.9229165 41.3096983, -72.9229165 41.3096987))">], ["created_at", Mon, 02 Jun 2014 11:59:51 UTC +00:00], ["id", nil], ["lonlat", nil], ["municipal_id", "abc123"], ["updated_at", Mon, 02 Jun 2014 11:59:51 UTC +00:00]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
   (0.1ms)  ROLLBACK

Для справки, я могу успешно запустить Parcel.create в консоли Rails и заставить переменные экземпляра возвращать ненулевые значения.

Я запускаю рельсы 3.2, использую postgres 9.3 с postgis 2 и сильно полагаюсь на activerecord-postgis-adaptor, RGeo, activerecord-postgres-hstore и другие драгоценные камни.

Есть предположения?


person treznick    schedule 02.06.2014    source источник
comment
Журнал @UriAgassi Rspec показывает ROLLBACK. Есть другая проблема... может быть проверка..   -  person Arup Rakshit    schedule 02.06.2014
comment
@ArupRakshit ROLLBACK может быть связан с политикой DatabaseCleaner, я априори не думаю, что это часть проблемы.   -  person Uri Agassi    schedule 02.06.2014
comment
Как только вы получите ответ, пропингуйте меня, пожалуйста.. Я также хотел увидеть причину этой загадочной ошибки :-)   -  person Arup Rakshit    schedule 02.06.2014
comment
Ответ @PeterAlvin сработал. ROLLBACK, вероятно, является политикой DatabaseCleaner.   -  person treznick    schedule 04.06.2014


Ответы (1)


Вы пропустили период. should_not предназначен для отправки объекту, значение которого вы проверяете, например:

parcel.municipal_id.nil?.should_not be_true

Однако, поскольку он исправлен для всех объектов, вы вызывали его для subject RSpec и передавали результат (Proc) в виде блока в nil?, который его игнорирует. Сообщение об ошибке указывает на то, что оцениваемый объект является экземпляром субъекта Parcel.

Кроме того, обратите внимание, что текущий и предпочтительный синтаксис для этого в RSpec:

expect(parcel.municipal_id.nil?).to_not be_truthy  # be_true was renamed to be_truthy in RSpec 3

или если вы действительно хотите проверить только значение true:

expect(parcel.municipal_id.nil?).to_not be(true)

или если вы хотите большей компактности:

expect(parcel.municipal_id).to_not be_nil

или если вы предпочитаете шекспировское чувство:

expect(parcel.municipal_id).to be

или если вы хотите воспользоваться преимуществом its, которое было выделено в отдельный гем в RSpec 3, то вы можете заменить весь вызов it на:

its(:municipal_id) { should_not be_nil }
person Peter Alfvin    schedule 02.06.2014
comment
Спасибо! Я не знал о новом синтаксисе RSpec. - person treznick; 02.06.2014