Подтвердить что ты не робот

Издевательские внутренние классы с Moq для модульного тестирования

Скажем, у меня есть класс "ClassA", который имеет зависимость от класса "ClassB" (вводится в ctr класса A). Я хочу высмеять ClassB, чтобы я мог тестировать ClassA в изоляции. Оба класса являются внутренними.

Исправьте меня, если я ошибаюсь, но похоже, что Moq может только издеваться над классом, если он является общедоступным, он имеет открытый конструктор без параметров, а методы, которые нужно издеваться, - это public virtual. Я не хочу, чтобы эти классы были общедоступными. Я что-то пропустил с помощью Moq, или это просто не подходит для того, что я хочу сделать?

Думаю, я мог бы создать интерфейс (скажем, "IClassB" ), который реализует ClassB, вставлять его в ClassA и вместо этого имитировать интерфейс. ClassB все еще может быть внутренним (хотя я понимаю, что методы интерфейса должны быть общедоступными). Хотя это сработает, я чувствую себя неловко в создании множества интерфейсов, единственной целью которых является поддержка unit test mocking. Мысли?

4b9b3361

Ответ 1

Вы можете сделать внутренности видимыми для Moq, добавив InternalsVisibleToAttribute в проект assembly.cs, например:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

Почему "DynamicProxyGenAssembly2", а не "Moq"? Это имя динамической сборки, созданной для размещения динамически генерируемых прокси-типов (все это обрабатывается еще одной библиотекой Castle DynamicProxy), которая используется Moq. Таким образом, вы открываете типы для динамической сборки прокси, а не для самого Moq.

Но какая точка насмешливого класса, если нет переопределяемого члена? Вы ничего не будете издеваться, и все вызовы будут использовать фактическую реализацию. Ваше второе решение,

Я предполагаю, что могу создать интерфейс (скажем, "IClassB" ), который реализует ClassB, вставлять его в ClassA и вместо этого имитировать интерфейс.

- это то, что я обычно делаю. Его цель - нечто большее, чем "поддержка unit test mocking" - это помогает вам создавать компоненты с ограниченной связью, что всегда стоит того, чего стоит стремиться.