Модульное тестирование C # защищенных методов

Я из мира Java EE, но теперь яЯ работаю над проектом .Net. В Java, когда я хотел протестировать защищенный метод, это было довольно просто, достаточно было иметь тестовый класс с тем же именем пакета. Есть ли что-нибудь подобное для C #? Есть ли хорошая практика для модульного тестирования защищенных методов? Я нашел только фреймворки и люди говорили, что я должен тестировать только публичные методы. Должно быть возможно сделать это без каких-либо рамок ...

Большое спасибо.

Ответы на вопрос(6)

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

Это не дает вам столько инкапсуляции и защиты, ноЭто довольно просто и может быть полезно.

добавить вAssemblyInfo.cs в сборке, содержащей внутренние методы

[assembly: InternalsVisibleTo("TestsAssembly")]

м / защищенным методам / полям.

PrivateObject - это класс в структуре модульного тестирования Microsoft, который является оберткой, которая позволяет вызывать обычно недоступных членов для модульного тестирования.

 Usama Aslam06 мар. 2017 г., 08:09
Это довольно просто, просто пройдите документациюmsdn.microsoft.com/en-us/library/...
 Erno de Weerd06 мар. 2017 г., 08:00
Этот ответ очень выиграл бы, если бы он объяснил, что такое PrivateObject.
 Matt26 мар. 2019 г., 16:06
Замечания: Это применимо только если выВы используете MSTest - не для NUnit и XUnit.

дов.

Смотрите здесь для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/66btctbe.aspx

 fiso16 нояб. 2012 г., 13:38
Может я'Я ошибаюсь, но я чувствую, что если рефлексия необходима для тестирования, потому что яЯ делаю что-то не так. Но если в C # это вполне нормально, то я привыкну.
 millebi08 сент. 2016 г., 23:04
Я считаю использование рефлексии разумным способом проверки закрытых функций класса. Я делаю это все время на Java, потому что в противном случае вы должны использовать "неправильно» Модификатор только для того, чтобы вы могли проверить правильно построенный класс. Если вам нужен Private или Protected, вы все равно сможете проводить тестирование, не добавляя нежелательный код в реальные классы, чтобы разрешить доступ (и который можно использовать для сбоя кода с точки зрения безопасности).
 Justin Harvey16 нояб. 2012 г., 13:53
Я тоже предпочел бы не использовать его. Я действительно просто хотел указать на эту технику на случай, если вы неЯ в курсе. Мне кажется, по крайней мере, возможно, что у вас есть частный метод, который вы хотите протестировать изолированно, чтобы иметь возможность легко тестировать его с большим диапазоном входных данных и ожидаемых результатов.

он нене решить мою проблему. Вывод из защищенного класса загрязнил мой тестовый класс многими другими вещами. В конце концов я решил извлечь логику для тестирования в открытый класс и протестировать ее. Конечно, это не будет работать для всех и может потребовать некоторого рефакторинга, но если вы прокрутили весь ответ до этого, это может просто помочь вам. :) Вот'пример

Старая ситуация:

protected class ProtectedClass{
   protected void ProtectedMethod(){
      //logic you wanted to test but can't :(
   }
}

Новая ситуация:

protected class ProtectedClass{
   private INewPublicClass _newPublicClass;

   public ProtectedClass(INewPublicClass newPublicClass) {
      _newPublicClass = newPublicClass;
   }

   protected void ProtectedMethod(){
      //the logic you wanted to test has been moved to another class
      _newPublicClass.DoStuff();
   }
}

public class NewPublicClass : INewPublicClass
{
   public void DoStuff() {
      //this logic can be tested!
   }
}

public class NewPublicClassTest
{
    NewPublicClass _target;
    public void DoStuff_WithoutInput_ShouldSucceed() {
        //Arrange test and call the method with the logic you want to test
        _target.DoStuff();
    }
}

который наследует класс, который вы хотите протестировать.

public class ExposedClassToTest : ClassToTest
{
    public bool ExposedProtectedMethod(int parameter)
    {
        return base.ProtectedMethod(parameter);
    }
}
Решение Вопроса

который вы тестируете, в своем тестовом классе.

public class Test1 : SomeClass
{
    Asert.AreEqual(1, SomeClass.ProtectedMethod());
}
 dragan.stepanovic12 авг. 2014 г., 17:21
@unarity Что делать, если мой тестовый класс неу вас нет конструктора args (например, у него только 4 конструктора args)? Когда я получаю от этого, мой тестовый класс выигралкомпилировать сTestClass does not contain a constructor that takes 0 arguments ошибка
 fiso16 нояб. 2012 г., 13:26
Спасибо за ваш быстрый ответ. Я проверил и этоработает. Я неЯ не знаю, будет ли это хорошим способом сделать это, но, по крайней мере, я могу начать с модульного тестирования.
 Gui19 окт. 2015 г., 01:01
Я добавляюТестируемые» класс в моем модульном тестовом проекте расширяет классы и оборачивает все их защищенные методы с помощью 'TestableMethods' и повторно реализует соответствующие конструкторы при необходимости. Тот же результат, но мне нравится отделять тесты от реализаций.
 erbaker12 февр. 2018 г., 21:10
Я думаю, что это может быть на самом делеAsert.AreEqual(1, Test1.ProtectedMethod()); поскольку производный тип должен вызываться внутри. Базовый метод все еще защищен, несмотря на то, что унаследован от.

Ваш ответ на вопрос