2016-06-29 2 views
0

У меня есть модель, как это:Как заглушить неактивные модели рекордов в Rails?

class Thing 
    class << self 
    def do_stuff(param) 
     result1 = method_one(param) 
     result2 = method_two(result1) 
    end 

    def method_one(param) 
     # tranformation 
    end 

    def method_two(result1) 
     # transformation 
    end 
    end 
end 

Как я могу проверить, что do_stuff правильно выполняет методы method_one и method_two с правильными аргументами? Я пробовал mock_model/mock_class, но это не имеет для меня никакого смысла. Я прочитал документацию, но мне все еще трудно понять это.

Мой тест выглядит следующим образом:

require 'rails_helper' 

RSpec.describe Thing, type: :model do 
    let!(:param) { create(:param) } 

    describe '#do_stuff' do 
    thing = double('thing') 
    expect(thing).to receive(:method_one).with param 
    thing.do_stuff param 
    end 
end 

Почему это не работает? Ошибка, которую я получаю, это то, что вещь получила неожиданный параметр сообщения. Но это было вполне ожидаемо, и это был тест. Где я иду не так?

ответ

2

Думаю, вы не должны удвоить свою модель. Следующий пример работает для меня:

class Thing 
    class << self 
    def do_stuff(param) 
     result1 = method_one(param) 
     result2 = method_two(result1) 
    end 

    def method_one(param) 
     param[:foo] 
    end 

    def method_two(result1) 
     # transformation 
     result1 
    end 
    end 
end 

# thing_spec.rb 
require 'rails_helper' 

RSpec.describe Thing, type: :model do 
    let!(:param) { {foo: "bar"} } 

    describe '#do_stuff' do 
    it 'should do stuff' do 
     expect(Thing).to receive(:method_one).with(param) 
     Thing.do_stuff param 
    end 
    end 
end 

Результат теста

[[email protected] ~/workspace/tapp]$ be rspec spec/models/thing_spec.rb 
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. (called from block in <top (required)> at /Users/retgoat/workspace/tapp/config/environments/test.rb:16) 
. 

Finished in 0.0069 seconds (files took 1.78 seconds to load) 
1 example, 0 failures 
+0

точно. для того, чтобы сделать это более сугубо, методы класса должны быть пропущены против класса, а не экземпляра. – jaydel

+0

Отличное спасибо! Это имеет смысл (также оцените время, затрачиваемое на проведение теста!). – user3162553

Смежные вопросы