Модульное тестирование wcf и блока приложения проверки - PullRequest
1 голос
/ 02 августа 2010

Я пытаюсь проверить, что я настроил для моей службы wcf.Какой лучший способ сделать это?

[ServiceContract]
[ValidationBehavior]
public interface IXmlSchemaService
{

    [OperationContract(Action = "SubmitSchema")]
    [return: MessageParameter(Name = "SubmitSchemaReturn")]
    [FaultContract(typeof(ValidationFault))]
    JobData SubmitSchema([XmlStringValidator] string xmlString);
}

XmlStringValidator - это созданный мной специальный валидатор.В идеале я хочу что-то вроде:

XmlSchemaService service = new XmlSchemaService();
service.SubmitSchema();

Но в этом случае проверка не вызывается.

Ответы [ 2 ]

2 голосов
/ 02 августа 2010

По определению, этот вид теста является интеграционным, а не модульным тестом.Проверка VAB будет иметь место только в том случае, если операция службы вызывается через конвейер WCF.

Хотя вы, возможно, могли бы форсировать свои вызовы через конвейер WCF, не создавая прокси-сервер клиента, не будет ли больше смысла тестироватьэто из клиентского прокси, чтобы убедиться, что клиент видит именно ту ошибку, которую вы хотите опубликовать в вашей службе, когда проверка не пройдена?

1 голос
/ 25 июля 2012

Вы можете проверить валидацию отдельно.Хотя невозможно выполнить проверку при непосредственном запуске служебного кода, в блоке приложения проверки есть два метода для проверки вашего кода (о котором я знаю).

  1. Использование ValidatorFactory для созданиявалидатор для вашего типа ввода и утверждают, что результаты валидации содержат ожидаемые ошибки.
  2. Создание экземпляра Validator напрямую и тестирование его с различными входными данными.

На практике я получаю комбинациюиз двух методов.Я использую первый метод для проверки ошибок валидации сложных типов ввода.В качестве примера:

[DataContract]
public class Product
{
    [DataMember, NotNullValidator]
    public string Name { get; set; }

    [DataMember, RangeValidator(0.0, RangeBoundaryType.Exclusive, 
        double.MaxValue, RangeBoundaryType.Ignore,
        ErrorMessage = "The value cannot be less than 0.")]
    public double Price { get; set; }    
}

[TestMethod]
public void InvalidProduct_ReturnsValidationErrors()
{
    Product request = new Product()
    {
        Price = -10.0
    };
    var validatorFactory = EnterpriseLibraryContainer.Current
        .GetInstance<ValidatorFactory>();
    var validator = validatorFactory.CreateValidator<Product>();
    var results = validator.Validate(request);

    Assert.IsTrue(results.Any(vr => vr.Key == "Name" 
        && vr.Message == "The value cannot be null."));
    Assert.IsTrue(results.Any(vr => vr.Key == "Price" 
        && vr.Message == "The value cannot be less than 0."));
}

Для метода 2 у меня будут тесты, которые охватывают мои сценарии использования для созданных мной Валидаторов.В качестве другого примера:

[TestMethod]
public void XmlStringValidator_ReturnsErrors_OnInvalidInput()
{
    var validator = new XmlStringValidator();

    var results = validator.Validate("Your input goes here");

    Assert.IsTrue(results.Any(vr => vr.Key == "[KeyNameInValidator]" && 
        vr.Message == "[Expected error message based on input]"));
}

Метод 2 позволит вам создать столько тестовых сценариев, сколько вы захотите для своего XmlStringValidator.

Более подробную информацию об этих методах можно найти в этой статье: Глава 6 - Изгнание проверки правильности

...