Насмешка результатов метода

попробуйте этот код, он будет работать для всех версий URL, таких как

9
задан Aaron Powell 18 September 2008 в 07:39
поделиться

6 ответов

Насколько я знаю, необходимо создать интерфейс или основной абстрактный класс для объекта Помощника. С Насмешками Носорога можно затем возвратить значение, которое Вы хотите.

С другой стороны, можно добавить перегрузку для LoadData, который принимает как параметры данные, которые Вы обычно получаете от объекта Помощника. Это могло бы даже быть легче.

2
ответ дан 4 December 2019 в 09:39
поделиться

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

Необходимо будет сделать некоторый рефакторинг, чтобы смочь ввести фиктивный объект с фиктивным GetSomeData () метод.

В этой упрощенной версии Вашего кода является трудным дать Вам прямой ответ. У Вас есть некоторые опции:

  • Создайте интерфейс для класса Помощника и позвольте, чтобы клиент ввел реализацию Помощника к классу MyClass. Но если Помощник является просто действительно служебным классом, он не имеет большого смысла.
  • Создайте защищенный метод в MyClass, названном getSomeData, и заставьте его только позвонить Помощнику. LoadSomeData. Затем замените вызов Помощнику. LoadSomeData в LoadData с для getSomeData. Теперь можно дразнить getSomeData метод для возвращения фиктивного значения.

Остерегайтесь простого создания интерфейса к классу Помощника и введите его с помощью метода. Это может выставить детали реализации. Почему клиент должен обеспечить реализацию служебного класса для вызова простой операции? Это увеличит сложность клиентов MyClass.

10
ответ дан 4 December 2019 в 09:39
поделиться

Я рекомендовал бы преобразовать то, что Вы имеете во что-то вроде этого:

public class MyClass()
{
    private IHelper _helper;

    public MyClass()
    {
        //Default constructor normal code would use.
        this._helper = new Helper();
    }

    public MyClass(IHelper helper)
    {
        if(helper == null)
        {
            throw new NullException(); //I forget the exact name but you get my drift ;)
        }
        this._helper = helper;
    }

    public void LoadData()
    {
        SomeProperty = this._helper.GetSomeData();
    }
    public object SomeProperty {get;set;}
}

Теперь Ваш класс поддерживает то, что известно как внедрение зависимости. Это позволяет Вам вводить реализацию класса помощника, и это гарантирует, чтобы Ваш класс должен был только зависеть от интерфейса. Когда Вы дразните, это знает, что Вы просто создаете насмешку, которая использует интерфейс IHelper, и передайте его в конструктору, и Ваш класс будет использовать это, как будто это - реальный класс Помощника.

Теперь, если бы Вы застреваете с помощью класса Помощника в качестве статического класса затем, я предложил бы, чтобы Вы использовали прокси/шаблон "адаптер" и перенесли статический класс с другим классом, который поддерживает интерфейс IHelper (что необходимо будет также создать).

Если в какой-то момент Вы хотите взять это шаг вперед, Вы могли бы полностью удалить реализацию Помощника по умолчанию из пересмотренного класса и использовать МОК (Инверсия Управления) контейнеры. Если бы thiis в новинку для Вас, хотя, я рекомендовал бы фокусироваться сначала на основных принципах того, почему вся эта дополнительная стычка имеет смысл (это, по моему скромному мнению).

Ваши модульные тесты будут выглядеть примерно так psuedo-код:

public Amazing_Mocking_Test()
{
    //Mock object setup
    MockObject mockery = new MockObject();
    IHelper myMock = (IHelper)mockery.createMockObject<IHelper>();
    mockery.On(myMock).Expect("GetSomeData").WithNoArguments().Return(Anything);

    //The actual test
    MyClass testClass = new MyClass(myMock);
    testClass.LoadData();

    //Ensure the mock had all of it's expectations met.
    mockery.VerifyExpectations();
}

Не стесняйтесь комментировать, есть ли у Вас какие-либо вопросы. (По тому, как у меня нет подсказки, если этот код все работы, я просто ввел его в своем браузере, я главным образом иллюстрирую понятия).

8
ответ дан 4 December 2019 в 09:39
поделиться

Я попробовал бы что-то вроде этого:

public class MyClass(){
  public void LoadData(IHelper helper){
    SomeProperty = helper.GetSomeData();
 }

Таким образом, можно копировать класс помощника, использующий, например, MOQ.

0
ответ дан 4 December 2019 в 09:39
поделиться

Да, платформа насмешки точно, что Вы ищете. Можно записать / расположение, как Вы хотите бесспорный дразнивший / заблокированные классы возвратиться.

Насмешки носорога, Typemock и Moq являются всеми хорошими вариантами для того, чтобы сделать это.

Сообщение Steven Walther при использовании Насмешек Носорога помогло мне много, когда я сначала начал играть с Насмешками Носорога.

0
ответ дан 4 December 2019 в 09:39
поделиться

Вы могли бы хотеть изучить Изолятор Typemock, который может "фальсифицировать" вызовы метода, не вынуждая Вас осуществить рефакторинг Ваш код. Я - dev в той компании, но решение является эффективным, если Вы хотели бы принять решение не изменить свой дизайн (или вынужденный не изменить его для тестируемости) он по www.Typemock.com

Блог Roy: ISerializable.com

2
ответ дан 4 December 2019 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: