Почему создают фиктивные объекты?

Chrome не поддерживает cookie для локальных файлов (или, как Peter Lyons упомянул, localhost*), если Вы не запускаете его с - enable-file-cookies флаг. Можно считать дискуссию об этом в http://code.google.com/p/chromium/issues/detail?id=535 .

*Chrome делает cookie поддержки при использовании локального IP-адреса (127.0.0.1) непосредственно. таким образом в localhost случае, который мог быть более легким обходным решением.

25
задан Jon Seigel 23 April 2010 в 14:41
поделиться

7 ответов

Вот несколько ситуаций, в которых насмешка необходима e:

  1. Когда вы тестируете взаимодействие с графическим интерфейсом
  2. Когда вы тестируете веб-приложение
  3. Когда вы тестируете код, который взаимодействует с оборудованием
  4. Когда вы тестируете устаревшие приложения
3
ответ дан 28 November 2019 в 20:53
поделиться

Чтобы использовать несколько иной подход (я думаю, что mocks хорошо освещены выше):
«Возьмите базу данных - если вы пишете тестовый код, возможно, вам это не понадобится. test подключен в реальном времени к производственной базе данных, где будут выполняться фактические операции ».

IMO - плохой способ указать пример использования. Вы бы никогда не «подключили его к базе данных prod» во время тестирования с использованием моков или без них. Каждый разработчик должен иметь локальную базу данных для тестирования. Затем вы перейдете к базе данных тестовых сред, затем, возможно, к UAT и, наконец, к продукту. Вы не насмехаетесь, чтобы избежать использования живой базы данных, вы насмехаетесь над тем, чтобы классы, не зависящие напрямую от базы данных, не требовали, чтобы вы настраивали базу данных.

Наконец (и я согласен, что могу получить некоторые комментарии по этому поводу) IMO, локальная база данных разработчика - допустимая вещь, которую можно использовать во время модульных тестов. Вы должны нажимать его только при тестировании кода, который напрямую взаимодействует с базой данных, и использовать имитацию, когда вы тестируете код, который косвенно обращается к базе данных.

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

Чтобы добавить к этим точным ответам, макеты объектов используются в структурном программировании сверху вниз или снизу вверх (в том числе ООП). Они предназначены для предоставления данных модулям верхнего уровня (графический интерфейс, логическая обработка) или для работы в качестве фиктивного вывода.

Рассмотрите подход сверху вниз: вы сначала разрабатываете графический интерфейс, но графический интерфейс должен содержать данные. Таким образом, вы создаете фиктивную базу данных, которая просто возвращает std :: vector <> данных. Вы определили «контракт» отношений. Кого волнует, что происходит внутри объекта базы данных - пока мой список GUI получает std :: vector <> Я счастлив. Это может быть ложная информация для входа в систему, все, что вам нужно для работы GUI.

Рассмотрите восходящий подход. Вы написали парсер, который читает текстовые файлы с разделителями. Как узнать, работает ли он? Вы пишете фиктивный «приемник данных» для этого объекта и маршрутизируете туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

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

Надеюсь, это поможет

Рассмотрим восходящий подход. Вы написали парсер, который читает текстовые файлы с разделителями. Как узнать, работает ли он? Вы пишете фиктивный «приемник данных» для этого объекта и маршрутизируете туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

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

Надеюсь, это поможет

Рассмотрим подход снизу вверх. Вы написали парсер, который читает текстовые файлы с разделителями. Как узнать, работает ли он? Вы пишете фиктивный «приемник данных» для этого объекта и маршрутизируете туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

И при определении фиктивных объектов вы также определили договор о том, как отношения. Это часто используется в тестовом программировании. Вы пишете тестовые примеры, используете фиктивные объекты, чтобы заставить его работать, и часто интерфейс фиктивного объекта становится окончательным интерфейсом (вот почему в какой-то момент вы можете захотеть разделить интерфейс фиктивного объекта на чистый абстрактный класс) .

Надеюсь, это поможет

Вы написали парсер, который читает текстовые файлы с разделителями. Как узнать, работает ли он? Вы пишете фиктивный «приемник данных» для этого объекта и маршрутизируете туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

И при определении фиктивных объектов вы также определили договор о том, как отношения. Это часто используется в тестовом программировании. Вы пишете тестовые примеры, используете фиктивные объекты, чтобы заставить его работать, и часто интерфейс фиктивного объекта становится окончательным интерфейсом (вот почему в какой-то момент вы можете захотеть разделить интерфейс фиктивного объекта на чистый абстрактный класс) .

Надеюсь, это поможет

Вы написали парсер, который читает текстовые файлы с разделителями. Как узнать, работает ли он? Вы пишете фиктивный «приемник данных» для этого объекта и маршрутизируете туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

И при определении фиктивных объектов вы также определили договор о том, как отношения. Это часто используется в тестовом программировании. Вы пишете тестовые примеры, используете фиктивные объекты, чтобы заставить его работать, и часто интерфейс фиктивного объекта становится окончательным интерфейсом (вот почему в какой-то момент вы можете захотеть разделить интерфейс фиктивного объекта на чистый абстрактный класс) .

Надеюсь, это поможет

для этого объекта и направить туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

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

Надеюсь, это поможет

для этого объекта и направить туда данные, чтобы проверить (хотя обычно), что данные читаются правильно. Для модуля на следующем уровне может потребоваться 2 источника данных, но вы написали только один.

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

Надеюсь, это поможет

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

Надеюсь, это поможет

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

Надеюсь, это поможет

5
ответ дан 28 November 2019 в 20:53
поделиться

Я бы резюмировал так:

  • Изоляция - Вы можете протестировать только метод, независимо от того, что он вызывает. Ваш тест становится настоящим модульным тестом (наиболее важный ИМХО)
  • Уменьшите время разработки теста - обычно быстрее использовать макет, чем создавать целый класс только для помощи в тестировании
  • Это позволяет вам тестировать, даже если вы не реализовали все зависимости - вам даже не нужно создавать, например, свой класс репозитория, и вы сможете протестировать класс, который будет использовать этот репозиторий
  • Защищает вас от внешних ресурсов - помогает в том смысле, что вам не нужно обращаться к базам данных, вызывать веб-службы, читать файлы, отправлять электронные письма или снимать средства с кредитной карты, а также так далее ...

В интервью я '

30
ответ дан 28 November 2019 в 20:53
поделиться

При модульном тестировании каждый тест предназначен для тестирования одного объекта. Однако у большинства объектов в системе есть другие объекты, с которыми они взаимодействуют. Мок-объекты - это фиктивные реализации этих других объектов, используемые для изоляции тестируемого объекта.

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

Возможно, стоит написать несколько простых модульных тестов и для фиктивных объектов.

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

Другие варианты использования могут заключаться в имитации пользовательского интерфейса при тестировании объекта контроллера в шаблоне MVC. Это позволяет лучше автоматизировать тестирование компонентов пользовательского интерфейса, которые могут несколько имитировать взаимодействие с пользователем.

Пример:

public interface IPersonDAO
{
    Person FindById(int id);
    int Count();
}

public class MockPersonDAO : IPersonDAO
{
    // public so the set of people can be loaded by the unit test
    public Dictionary<int, Person> _DataStore;

    public MockPersonDAO()
    {
        _DataStore = new Dictionary<int, Person>();
    }

    public Person FindById(int id)
    {
        return _DataStore[id];
    }

    public int Count()
    {
        return _DataStore.Count;
    }
}
5
ответ дан 28 November 2019 в 20:53
поделиться

Мок-объекты / функции также могут быть полезны при работе в команде. Если вы работаете над частью базы кода, которая зависит от другой части базы кода, за которую отвечает кто-то еще - которая все еще пишется или еще не написана - фиктивный объект / функция полезен в дает вам ожидаемый результат, чтобы вы могли продолжить свою работу, не задерживаясь в ожидании, пока другой человек закончит свою часть.

3
ответ дан 28 November 2019 в 20:53
поделиться

Здесь я пойду в другом направлении. Stubbing / Faking делает все, что упомянуто выше, но, возможно, интервьюеры думали о mocks как о фальшивом объекте, который заставляет тест пройти или не пройти. Я основываюсь на терминологии xUnit . Это могло привести к некоторой дискуссии о тестировании состояния и тестировании поведения / взаимодействия .

Возможно, они искали ответ: фиктивный объект отличается от заглушки. Заглушка имитирует зависимость для тестируемого метода. Заглушка не должна приводить к сбою теста. Это делает макет , а также проверяет, как и когда он вызывается. Моки приводят к тому, что тест проходит или не проходит в зависимости от основного поведения. Это имеет то преимущество, что меньше зависит от данных во время теста, но более тесно связано с реализацией метода.

Конечно, это предположение, более вероятно, что они просто хотели, чтобы вы описали преимущества заглушки и DI.

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

Конечно, это предположение, более вероятно, что они просто хотели, чтобы вы описали преимущества заглушки и DI.

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

Конечно, это предположение, более вероятно, что они просто хотели, чтобы вы описали преимущества заглушки и DI.

2
ответ дан 28 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

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