Если вы используете 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 и только в том случае, если у кого-то нет идеи получше. : -)
Рассмотрите возможность издевательства над типом 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» , то вам нужно отметить свойство как виртуальный .
В конструкторе класса можно установить только свойства только для чтения. У объекта Person должен быть конструктор, принимающий id, ssn и totalDrWhoEpisodesWatched. Конечно, если это сгенерированный linqtosql объект, у вас могут возникнуть проблемы с его изменением, поскольку код генерируется автоматически.
Вы можете рассмотреть возможность использования сопоставленного объекта для отображения в вашем репозитории ... так что у вас никогда не будет для использования вашего объекта linqtosql в качестве модели.
Если это для тестов - рассмотрите возможность использования отражение. Это не повлечет за собой возню с вашей моделью предметной области.
Например - я получил класс FactoryBase, который использует отражение для установки необходимой опоры с помощью лямбда-выражения через параметры (например, this ). Работает как шарм - создание новой фабрики просто, как определение типа репозитория и данных объекта по умолчанию.
В .NET вы можете пометить свои сеттеры как «внутренние» и использовать атрибут сборки InternalsVisibleTo, чтобы сделать внутренние компоненты видимыми для вашей тестовой сборки. Таким образом, ваши сеттеры не будут общедоступными, но вы все равно сможете получить к ним доступ.
примечание: хотя вопрос не помечен как .NET, я предполагал, что он основан на использовании вами синтаксиса инициализатора объекта. Если мое предположение было неверным, это предложение неприменимо (если, конечно, язык, который вы используете, не имеет эквивалентной функции).
Я также использую 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);
}
}