Как смоделировать метод внутри того же класса, который тестируется? - PullRequest
0 голосов
/ 01 июня 2018

Я создаю несколько юнит-тестов для метода ValidateObject в сервисе ObjectService.Метод ValidateObject вызывает другой метод ValidateObjectPropertyB.Я хочу смоделировать вызовы последнего метода.

ObjectService и соответствующий метод выглядят так:

public class ObjectService : IObjectService
{
    public bool ValidateObject(object objectToValidate)
    {
        return 
            !String.IsNullOrEmpty(objectToValidate.PropertyA) &&
            ValidateObjectPropertyB(objectToValidate.PropertyB, currentUserId);
    }

    public bool ValidateObjectPropertyB(long propertyB, long userId)
    {
        return validationResult;
    }
}

Прямо сейчас мой класс Test ObjectServiceTest содержит следующий код:

public class ObjectServiceTest
{
    var objectToValidate = new Object(validPropertyA, validPropertyB);

    using(var mock = new AutoMock.GetStrict())
    {
        var mockObjectService = new Mock<IObjectService>();
        mockObjectService.callBase = true;
        mockObjectService.Setup(s => s.ValidateObjectPropertyB(objectToValidate.PropertyB, _user.Id)).Returns(true);

        var service = mock.Create<ObjectService>();
        var result = service.ValidateObject(objectTovalidate);

        Assert.IsTrue(result);
    }
}

Вышеприведенный тест не пройден, поскольку result равен false, значение for PropertyA успешно. Что я делаю не так?

1 Ответ

0 голосов
/ 08 июня 2018

ValidateObject работает частично, вызывая ValidateObjectPropertyB.Я предполагаю, что вы хотите смоделировать этот второй метод так, чтобы вы могли продемонстрировать, что ValidateObject действительно вызывает ValidateObjectPropertyB (при условии!тестируют детали реализации, чего обычно не следует делать.Рассмотрим функцию, которая принимает два целочисленных значения и возвращает их сумму. Вы хотели бы убедиться, что когда эта функция прошла 3 и 5 вернула 8, вам не следует проверять, что она пришла к этому ответу, используя определенный метод / класс в разделекапот, потому что это не имеет отношения к желаемому результату, и если в будущем вы решите, что хотите реорганизовать свой код, тест, скорее всего, начнет проваливаться, даже если код все еще возвращает желаемый результат.

Если посмотреть на ваш код, тоКажется, что возвращаемое значение ValidateObject напрямую не зависит от вызова метода ValidateObjectPropertyB, а скорее от значения validationResult.Именно это значение необходимо установить для правильного тестирования ValidateObject.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...