Есть ли обходной путь для установки [HostType ("Moles")] при работе с анонимными методами в MSpec? - PullRequest
2 голосов
/ 30 марта 2012

Я использую Pex и Moles для моего низкоуровневого модульного тестирования, но я также изучаю MSpec для проверки бизнес-логики и хотел бы продолжать использовать Moles для согласованности.Проблема, я думаю, заключается в том, что MSPec использует анонимные методы, поэтому нет способа применить атрибут HostType ("Moles").Например:

Because of = () =>
   employeeList = EmployeeManager.GetUsersByRoles(rolesToLoad);

It should_return_a_list_of_employees = () =>
   employeeList.ShouldNotBeNull();

Я издеваюсь над провайдером ролей, вызываемым внутри «GetUsersByRoles», и когда я пытаюсь запустить этот тест через MSpec, я получаю стандартное «Моулз требует, чтобы тесты были в инструментальном процессеmsgstr "ошибка, с инструкцией добавить [HostType (" Moles ")] в мой метод тестирования.Есть ли какой-нибудь обходной или другой вариант, доступный здесь?

Примечание: я скачал MSMSpec.tt и изменил его, чтобы включить атрибут в сгенерированные VSTests, но я хотел бы иметь возможность запускать тесты MSpecнепосредственно через своего бегуна или TestDriven.net, чтобы я мог получить дружественный вывод для BA и владельцев бизнеса.

1 Ответ

1 голос
/ 01 апреля 2012

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

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

В Руководстве по родинкам говорится: «Родинки могут использоваться для обхода любого метода .NET, включая не виртуальные и статические методы в закрытых типах» Таким образом, действуя в предположении, что Моль использует рефлексию для идентификации учеников, это безопасная ставка. Все, что не может быть вызвано через делегат, Action или Func, не может быть смоделировано.

...