Как мне обеспечить чистую реализацию шва - PullRequest
0 голосов
/ 25 октября 2011

Во многих случаях я пишу код с защищенными виртуальными методами для обеспечения швов (чтобы помочь в модульном тестировании):

public class TemporaryStorage     
{
    public TemporaryStorage()
    {
     this.RootPath = Path.Combine(this.GetEnvironmentPath, Path.GetRandomFileName());
    }
    public string RootPath { get; private set; }
    protected virtual string GetEnvironmentPath
    {
         get { return LocalStorage.GetEnvironmentPath(); }
    }
}

Затем в тестовом наборе я буду наследовать этот класс и предоставлю пользовательскую реализацию для GetEnvironmentPath ().

Вместо создания производного класса в наборе тестов, существует ли лучший подход? Могу ли я использовать MOQ для достижения тех же результатов (предоставляя реализацию заместителя для GetEnvironmentPath)?

С уважением,

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Самый простой способ подделать тестируемые классы - использовать интерфейсы. Когда тестируемый класс реализует определенный интерфейс, вы можете просто написать макет, используя MOQ, например:

Допустим, у вас есть такой интерфейс:

private interface IMyInterface
{
    string MyMethod(int value);

    int MyProperty { get; set; }
}

Тогда вы можете настроить макет следующим образом:

var mockedObject = new Mock<IMyInterface>();
mockedObject.Setup(x => x.MyMethod(It.IsAny<int>())).Returns<int>(value => value.ToString());
mockedObject.SetupGet(x => x.MyProperty).Returns(42);

Вы можете получить доступ к своему максируемому объекту в модульном тесте следующим образом:

DoSomething(mockedObject.Object);
0 голосов
/ 25 октября 2011

Rhino Mocks - это одна из фальшивых платформ, которая поддерживает это.

Если вы посмотрите на следующую информацию, вы увидите пример .

Чтобы убедиться,что защищенный метод может быть проверен модулем, вы можете изменить подпись на внутреннюю защищенную вместо защищенной.Если вы затем используете InternalsVisibleTo в вашем AssemblyInfo.cs, вы можете сделать свои внутренние элементы видимыми для проекта модульного тестирования (см. Как сделать «защищенный» метод доступным для «частичного» моделирования с помощью RhinoMocks ).

...