В TDD и DDD, как Вы обрабатываете свойства только для чтения в фальшивках?

Если вы используете gcc / g ++, опция -M или -MM выведет строку с информацией, которую вы ищете. (Первый будет включать системные заголовки, а второй - нет. Существуют и другие варианты; см. Руководство.)

$ gcc -M -c foo.c
foo.o: foo.c /usr/include/stdint.h /usr/include/features.h \
  /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
  /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
  /usr/include/bits/wchar.h

Вам нужно будет удалить foo.o: foo.c в начале, но остальное список всех заголовков, от которых зависит файл, поэтому не составит труда написать сценарий для их сбора и обобщения.

Конечно, это предложение полезно только в Unix и только в том случае, если у кого-то нет идеи получше. : -)

5
задан John 9 June 2009 в 14:00
поделиться

5 ответов

Рассмотрите возможность издевательства над типом Person в ваш тест. Пример использования Moq :

var mock = new Mock<Person>();
mock.SetupGet(p => p.id).Returns("EMP12345");
mock.SetupGet(p => p.ssn).Returns("123-45-6789");
mock.SetupGet(p => p.totalDrWhoEpisodesWatched).Returns(42);
return mock.Object;

В противном случае попробуйте выяснить, как LINQ to SQL устанавливает эти свойства только для чтения.

РЕДАКТИРОВАТЬ : если вы попытаетесь выполнить вышеуказанное, и Moq выдаст исключение ArgumentException в вызове SetupGet с сообщением «Недопустимая установка на непереопределяемом элементе: p => p.id» , то вам нужно отметить свойство как виртуальный .

6
ответ дан 14 December 2019 в 04:46
поделиться

В конструкторе класса можно установить только свойства только для чтения. У объекта Person должен быть конструктор, принимающий id, ssn и totalDrWhoEpisodesWatched. Конечно, если это сгенерированный linqtosql объект, у вас могут возникнуть проблемы с его изменением, поскольку код генерируется автоматически.

Вы можете рассмотреть возможность использования сопоставленного объекта для отображения в вашем репозитории ... так что у вас никогда не будет для использования вашего объекта linqtosql в качестве модели.

1
ответ дан 14 December 2019 в 04:46
поделиться

Если это для тестов - рассмотрите возможность использования отражение. Это не повлечет за собой возню с вашей моделью предметной области.

Например - я получил класс FactoryBase, который использует отражение для установки необходимой опоры с помощью лямбда-выражения через параметры (например, this ). Работает как шарм - создание новой фабрики просто, как определение типа репозитория и данных объекта по умолчанию.

0
ответ дан 14 December 2019 в 04:46
поделиться

В .NET вы можете пометить свои сеттеры как «внутренние» и использовать атрибут сборки InternalsVisibleTo, чтобы сделать внутренние компоненты видимыми для вашей тестовой сборки. Таким образом, ваши сеттеры не будут общедоступными, но вы все равно сможете получить к ним доступ.

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

1
ответ дан 14 December 2019 в 04:46
поделиться

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

Поскольку подделка может иметь дополнительные методы, которых нет в «производственной» реализации, я бы добавил несколько дополнительных методов в свою поддельную реализацию для обработки настройки режима только для чтения часть.

Примерно так:

public class FakePersonRepository : IPersonRespository
{
    private IDictionary<int, Person> _people = new Dictionary<int, Person>();

    public Person GetPerson(int id)  // Interface Implementation
    {
        return _people(id);
    }

    public void SetPerson(int id, Person person)  // Not part of interface
    {
         _people.Add(id, person);
    }

}
0
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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