Тестирование модулей в rspec

У меня была такая же проблема с использованием команды brew для запуска службы mysql. Если вы используете MacOS, перейдите в раздел «Системные настройки» и щелкните значок «MySQL». Вероятно, вы увидите информационное сообщение о разрешении, которое запрещено в некоторых каталогах. Все, что вам нужно сделать, это разрешить это.

Это сработало для меня.

  1. Откройте ваш терминал
  2. Выполните следующую команду: sudo chown -R mysql /usr/local/mysql/data
169
задан Eimantas 9 October 2009 в 10:11
поделиться

5 ответов

Я нашел лучшее решение на домашней странице rspec. По-видимому, он поддерживает общие группы примеров. Из https://www.relishapp.com/rspec/rspec-core/v/2-13/docs/example-groups/shared-examples !

Группы общих примеров

Вы можете создать общие группы примеров и включить эти группы в другие группы.

Предположим, у вас есть поведение, которое применяется ко всем редакциям вашего продукт, как большой, так и малый.

Во-первых, исключите «общие» поведение:

shared_examples_for "all editions" do   
  it "should behave like all editions" do   
  end 
end

затем, когда вам нужно определить поведение для больших и малых изданий, ссылаться на общее поведение, используя метод it_should_behave_like ().

describe "SmallEdition" do  
  it_should_behave_like "all editions"
  it "should also behave like a small edition" do   
  end 
end
24
ответ дан 23 November 2019 в 20:49
поделиться

Это - текущий шаблон, так как Вы испытываете необходимость для тестирования больше чем одного модуля. По этой причине это более, чем желательно для создания помощника для этого.

я нашел это сообщение , который объясняет, как сделать это, но я справляюсь здесь, так как сайт мог бы быть удален в какой-то момент.

Это должно избежать , экземпляры объектов не реализуют метод экземпляра:: безотносительно ошибка Вы добираетесь при попытке до allow методы на dummy класс.

Код:

В spec/support/helpers/dummy_class_helpers.rb

module DummyClassHelpers

  def dummy_class(name, &block)
    let(name.to_s.underscore) do
      klass = Class.new(&block)

      self.class.const_set name.to_s.classify, klass
    end
  end

end

В spec/spec_helper.rb

# skip this if you want to manually require
Dir[File.expand_path("../support/**/*.rb", __FILE__)].each {|f| require f}

RSpec.configure do |config|
  config.extend DummyClassHelpers
end

В Ваших спецификациях:

require 'spec_helper'

RSpec.shared_examples "JsonSerializerConcern" do

  dummy_class(:dummy)

  dummy_class(:dummy_serializer) do
     def self.represent(object)
     end
   end

  describe "#serialize_collection" do
    it "wraps a record in a serializer" do
      expect(dummy_serializer).to receive(:represent).with(an_instance_of(dummy)).exactly(3).times

      subject.serialize_collection [dummy.new, dummy.new, dummy.new]
    end
  end
end
-1
ответ дан 23 November 2019 в 20:49
поделиться

Для тестирования модуля используйте:

describe MyCoolModule do
  subject(:my_instance) { Class.new.extend(described_class) }

  # examples
end

Для высушивания некоторых вещей Вы используете через несколько спецификаций, можно использовать общий контекст:

RSpec.shared_context 'some shared context' do
  let(:reused_thing)       { create :the_thing }
  let(:reused_other_thing) { create :the_thing }

  shared_examples_for 'the stuff' do
    it { ... }
    it { ... }
  end
end
require 'some_shared_context'

describe MyCoolClass do
  include_context 'some shared context'

  it_behaves_like 'the stuff'

  it_behaves_like 'the stuff' do
    let(:reused_thing) { create :overrides_the_thing_in_shared_context }
  end
end

Ресурсы:

0
ответ дан 23 November 2019 в 20:49
поделиться

Что сказал Майк. Вот тривиальный пример:

код модуля ...

module Say
  def hello
    "hello"
  end
end

фрагмент спецификации ...

class DummyClass
end

before(:each) do
  @dummy_class = DummyClass.new
  @dummy_class.extend(Say)
end

it "get hello string" do
  expect(@dummy_class.hello).to eq "hello"
end
109
ответ дан 23 November 2019 в 20:49
поделиться

Off the top of my head, could you create a dummy class in your test script and include the module into that? Then test that the dummy class has the behaviour in the way you'd expect.

EDIT: If, as pointed out in the comments, the module expects some behaviours to be present in the class into which it's mixed, then I'd try to implement dummies of those behaviours. Just enough to make the module happy to perform its duties.

That said, I'd be a little nervous about my design when a module expects a whole lot from its host (do we say "host"?) class - If I don't already inherit from a base class or can't inject the new functionality into the inheritance tree then I think I'd be trying to minimise any such expectations that a module might have. My concern being that my design would start to develop some areas of unpleasant inflexibility.

21
ответ дан 23 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: