2009-10-26 6 views
2

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

/// <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 бар, но там, где мне нужно, чтобы это сделать? Спасибо, Seb

ответ

6

Прежде чем продолжить, найдите термин «инъекция зависимостей».

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

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

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

Rewire текущего кода, чтобы создать целевой класс, как этот

var class = new AnonClass(SharedServicesClientProxy.Instance); 

в тесте, проходит в макете объекта вместо объекта, возвращаемого Singleton

Смежные вопросы