2015-06-29 2 views
1

Я создал функцию, которая проверяет некоторые правила. Функция должна возвращать bool всякий раз, когда элемент списка соответствует элементу другого списка.Как запустить WebServices в модульном тесте

Вот соответствующий код Правилом класса

public override TestResult Execute() 
{ 
     Instrument ins = (Items.Length > 0) ? Items[0] as Instrument : null; 
     string errorInfo; 

     if (ins == null) 
     { 
      Result.Message = "Unable to perform test"; 
      Result.Status = ResultStatus.Error; 
      return Result; 
     } 
     if (MPICSupportDB(ins)) 
     { 
      Result.Message = "DB not supported by MPIC"; 
      Result.Status = ResultStatus.Yellow; 
     } 
     else 
     { 
      Result.Status = ResultStatus.Green; 
     } 

     return Result; 
} 

private bool MPICSupportDB(Instrument ins) 
{ 
    IServiceProviderFactory serviceFactory = new WebServiceProviderFactory(); 
    IInterfaceAssignmentService wService = serviceFactory.CreateInterfaceAssignmentService(); 
    InterfaceAssignment wAssignments = wService.LoadAssignmentGroup("R4"); 

    return ins.Connections.OfType<InterfaceConnection>() 
          .Where(conn => conn.Card.IsDB) 
          .Any(conn => wAssignments.PartMasters 
          .Any(partNumber => (conn.CardPartNumber == partNumber.PartNumber)));    
} 

Я пытаюсь проверить функцию MPICSupportDB в модульном тесте. До сих пор я начал создавать свой модульный тест (см. Ниже), но теперь я потерялся, и я понятия не имею, что делать.

[TestMethod] 
public void TestForcompatibleDB() 
{ 
    var ins = new Instrument(); 
    var serviceFactoryMock = new Mock<IServiceProviderFactory>(); 
    var wserviceTest = new Mock<IInterfaceAssignmentService>(); 
    var wassagnementTest = new Mock<InterfaceAssignment>(); 

    // adding an MPIC card 
    ins.Connections.Add(AddCard(CardType.MPIC, "MA505400612268", "CARD1", 0, ins)); 

    // adding an MPIC daughterboard 
    ins.Connections.Add(AddCard(CardType.GPIM_DB, "MA335022012268", "DB1", 1, ins)); 


    var rule = new Rule026(RuleApplicability.Test, new object[] { ins }); 
    var result = rule.Execute(); 

    Assert.IsNotNull(result); 
    Assert.AreEqual(ResultStatus.Green, result.Status); 

} 

Проблема заключается в том, что классы, как Webservice и factoryService не может быть запущена непосредственно в модульном тесте.

Может кто-нибудь объяснить мне, как правильно издеваться над этим объектом и выполнить мой тест?

ответ

0

Вам необходимо предоставить IServiceProviderFactory классу Rule026, а не создавать его внутри класса. Это позволит вам использовать свои Mocks, которые вы создаете. Наиболее распространенным подходом было бы введение конструктора. Вы не предоставили конструктор вашего класса Rule, но если изменить его на что-то вроде этого:

public Rule026(/*otherArgs*/, IServiceProviderFactory scpFactory = null) { 
    if(null == scpFactory) 
     scpFactory = new ServiceProviderFactory(); 
    } 
    _serviceProviderFactory = scpFactory; 
} 

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

Как только вы можете передать свои макеты, вам просто нужно настроить цепочку возврата, чтобы позволить mocks возвращать друг друга. Что-то вроде:

var serviceFactoryMock = new Mock<IServiceProviderFactory>(); 
    var wserviceTest = new Mock<IInterfaceAssignmentService>(); 
    var wassagnementTest = new Mock<InterfaceAssignment>(); 

    serviceFactoryMock.Setup(x=>x.CreateInterfaceAssignmentService()) 
         .Returns(wserviceTest.Object); 
    wserviceTest.Setup(x=>x.CreateInterfaceAssignmentService()) 
       .Returns(wassagnementTest.Object); 
    wassagnementTest.Setup(x=>x.LoadAssignmentGroup(It.IsAny<string>())) 
       .Returns(cannedInterfaceAssignmentResponse); 

А затем поставить издеваться при построении вашего объекта:

var rule = new Rule026(RuleApplicability.Test, 
         new object[] { ins }, 
         serviceFactoryMock.Object); 

Вы также можете добавить проверки и т.д., чтобы ваши издевается, в зависимости от того, что вы пытаетесь проверить и ваш особый стиль тестирования.

+0

Спасибо, очень, я попробую это ..... спасибо за вдохновение – napi15