Модульное тестирование C# с аксессорами - Конструкторы не работают

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

Мои конструкторы для классов Accessor не принимают их аргументы. Пример:

class SearchControl(bool isLogged, MainWindow mainWindow);
class MainWindow();

Для создания объекта типа SearchControl вам нужно передать объект mainWindow. Поэтому, если я сделал это с не классами Accessor, я не могу получить доступ к закрытым методам и свойствам и не могу их протестировать.

MainWindow mainWindow = new MainWindow();
SearchControl serchControl = new SearchControl(false, mainWindow);

Я должен использовать предложения Accessor, но когда я делаю это, мой код подчеркивается красным, и Visual Studio говорит, что аргументы не могут быть приняты. Почему, когда я передаю аргументы одного типа. Если я снова передам объект MainClass в объект SearchControl_Accessor, я не смогу получить доступ к свойствам в MainClass. Так что код с аксессорами выглядит так:

MainWindow_Accessor mainWindow = new MainWindiow_Accessor();
SearchControl_Accessor searchControl = new SearchControl_Accessor(false, mainWindow);

Любой, кто знает, что не так и что я должен сделать, чтобы это исправить. Спасибо:)

2 ответа

Если вам необходимо выполнить модульное тестирование закрытых методов, возможно, начинать разработку классов плохо? Мое (несколько слабое, я признаю) понимание состоит в том, что "внешний мир" не должен заботиться о частных методах объекта - только в том случае, если он делает то, что написано на коробке справа. Частные методы не являются частью "контракта" - их реализация, типы возвращаемых данных и т. Д. Могут меняться, публичный API имеет значение.

В каком случае публичные методы вашего объекта могут пройти тесты, в то время как частные методы не сработали? Если это возможно, то либо:

  • публичные методы не проверены должным образом, или
  • частные методы не имеют значения - они не влияют на поведение объекта и, следовательно, не нуждаются в проверке.

Или это невозможно, но вы хотите протестировать закрытые методы, чтобы определить, какой из них приводит к неожиданному поведению какого-либо открытого метода?

Если это так, это может означать, что:

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

Обычно вы не можете получить доступ к закрытым свойствам, методам и полям объекта. Если вам действительно нужно получить к нему доступ, вы можете рассмотреть возможность сделать их internal (вместо private). Если ваши тесты находятся в другой сборке, проверьте атрибут InternalsVisibleTo. Этот атрибут, при правильном применении к сборке с кодом, который вы хотите проверить, позволяет вашей сборке с тестами получать доступ к вашим методам, полям и свойствам, которые вы отметили internal,

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

Другие вопросы по тегам