Приватный аксессор не строит при использовании MSBuild - PullRequest
4 голосов
/ 24 августа 2009

Мой сервер сборки использует MSBuild для сборки моего приложения. Наши модульные тесты требуют доступа к некоторым закрытым членам для тестирования, поэтому мы используем встроенные частные средства доступа. Visual Studio не имеет проблем с этим, но когда мы отправляем наш код на сервер сборки, мы получаем ошибку:

MyTest.cs (96,13): ошибкаCS0246: имя типа или пространства имен 'My_Accessor' не может быть найден (вы пропускаете используя директиву или сборку ссылка?)

Почему MSBuild игнорирует частные средства доступа и как я могу это исправить?

Мы используем NUnit для нашей среды тестирования и CruiseControl.Net для нашего сервера непрерывной интеграции.

EDIT: Согласно комментарию, здесь приведен тестовый код для базового класса для класса шаблона репозитория.

MockRepository mocks = new MockRepository();

IDataContextWrapper wrapper = mocks.DynamicMock<IDataContextWrapper>();

Repository_Accessor target = new Repository_Accessor(wrapper);
Assert.AreEqual(wrapper, target._DataContext);

Этот код просто проверяет, что переменные-члены _DataContext установлены на ложную оболочку. Сбой при сборке с MSBuild на моем сервере сборки.

Ответы [ 4 ]

1 голос
/ 27 августа 2009

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

Сгенерированная сборка также известна в качестве частного доступа. Вы также можете генерировать частные средства доступа из IDE, но вы можете использовать publicize.exe вместо этого в автоматизации, сценариев и сценарии сборки.

Я также использую частные средства доступа в некоторых тестах и ​​использую TFS TeamBuild и MSTest. Частный аксессор генерируется во время сборки. Мне не нужно было ничего делать вручную.

0 голосов
/ 27 августа 2009

Как бы хорошо ни отвечал Мехмет, боюсь, единственный способ заставить это работать - это установить Visual Studio. После того, как это было установлено, msbuild начал производить средства доступа для меня. Не идеальное решение, но, по крайней мере, я могу двигаться дальше.

0 голосов
/ 27 августа 2009

Вы упомянули частные средства доступа, поэтому я предположил, что вы используете Reflection, чтобы выставить некоторых частных членов для модульного тестирования?

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

Вы уверены, что пользователь Cruise Control работает под управлением, а затем запускает сборку и запускает тест CruiseControl под учетной записью, которой назначено " ReflectionPermission " или "Полное доверие" от. NET время выполнения?

Места для поиска / google: настройки machine.config на сервере сборки, собственный веб-контроль Cruise Control (не уверен, есть ли он, так как я долгое время не использовал CC ) и, наконец, (и наименее вероятно) файл app.config как организатора теста, так и самого тестируемого приложения.

В противном случае, я предлагаю вам использовать инструмент Publicize, как предложил @Mehmet Aras.

0 голосов
/ 27 августа 2009

У вас случайно [сборка: InternalsVisibleTo] установлена ​​правильно локально, но неправильно в вашей системе сборки?

(Кроме того, Assert.AreSame () может быть более подходящим).

...