Модульное тестирование метода, в котором я делаю внедрение зависимости

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.

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

0
задан Dirk Herrmann 5 March 2019 в 16:47
поделиться

1 ответ

Я думаю, ваш код выглядит следующим образом.

class TodoApp
  def initialize 
    @todos = []
  end

  def add(task, day, todo = Todo)
    @todos.push(todo.new(task, day))
    return "#{task} was added to your todos"
  end
end

Это НЕ внедрение пустого массива в TodoApp. И, следовательно, вам будет трудно получить доступ к нему из тестов.

Но если ваш объект TodoApp выглядел следующим образом:

class TodoApp
  def initialize(todos = [])
    @todos = todos
  end

  def add(task, day, todo = Todo)
    @todos.push(todo.new(task, day))
    return "#{task} was added to your todos"
  end
end

Теперь вы вводите в TodoApp что-то, что можно смоделировать или даже просто оценить:

describe TodoApp do
  subject(:app) { described_class.new(todos) }

  let(:todos) { [] }

  describe '#add' do
    subject(:add) { app.add(task, day) }

    let(:task) { 'task' }
    let(:day) { 'day' }

    it 'pushes the item on the list of todos' do
      expect { add }.to change { todos.length }.by(1)
    end
  end
end
0
ответ дан aridlehoover 5 March 2019 в 16:47
поделиться
Другие вопросы по тегам:

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