Moq прокси для модульного тестирования - PullRequest
2 голосов
/ 26 октября 2009

Я новичок в использовании Moq и не могу найти способ сделать это. У меня есть частный метод generateId, который называется

/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}

Я хотел провести модульное тестирование этого метода, и по этой причине мне нужно издеваться над Прокси. SharedServicesClientProxy - это просто объект, который реализует интерфейс ISharedServices, но добавляет синглтон. Я хотел проверить, что все строки правильно возвращали строку, начинающуюся с «EX». это мой модульный тест, использующий Moq

    /// <summary>
    /// A test for GenerateCallId
    /// A CallId for external systems should always start by "EX"
    ///</summary>
    [TestMethod()]
    [DeploymentItem("myDll.dll")]
    public void GenerateCallIdTest()
    {
        myService_Accessor target = new myService_Accessor();
        var SharedServicesClientProxy = new Mock<ISharedServices>();
        SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286);
        string actual;
        string extCallIdPrefix = "EX";
        actual = target.GenerateCallId();
        Assert.IsTrue(actual.StartsWith(extCallIdPrefix));
    }

Полагаю, я издеваюсь не в том месте?

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

        /// <summary>
        /// dummy test
        ///</summary>
        [TestMethod()]
        [DeploymentItem("myDll.dll")]
        public void Foo()
        {
            myService_Accessor target = new myService_Accessor();
            boolexpected = false;
            actual = target.Foo();
            Assert.IsTrue(actual,expected);
        }

        /// <summary>
        /// Foo
        /// </summary>
        /// <returns></returns>
        private bool Foo()
        {
            return this.Bar();
        }

Мне нужно moq Bar, но где мне это делать? Спасибо, Себ

1 Ответ

6 голосов
/ 26 октября 2009

Поиск термина "Внедрение зависимостей", прежде чем продолжить.

У вас есть зависимость от SharedServicesClientProxy.Instance, который является Singleton. Это вызовет проблемы с изоляцией тестов, так как вы будете повторно использовать один и тот же экземпляр в тестах и ​​будете подвержены проблемам с оставшимся состоянием.

Я бы посоветовал внедрить зависимости, подобные этой (и OT - вам не следует тестировать закрытые методы ... тестировать через открытый интерфейс. Там это вне моей системы ..:)

public class AnonClass
{
  ISharedServices _sharedServices;
  AnonClass(ISharedServices sharedServicesObj)
  {
    _sharedServices = sharedServicesObj;
  }
  public string GenerateCallId()
  {
    return "EX" + _sharedServices.GenerateId().ToString();
  }
}

Перепишите свой текущий код, чтобы создать целевой класс, подобный этому

var class = new AnonClass(SharedServicesClientProxy.Instance);

В вашем тесте передайте фиктивный объект вместо объекта, возвращаемого синглтоном

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