Модульное тестирование wcf и блока приложения проверки

Я пытаюсь проверить правильность настройки моего сервиса 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 ответа

Решение

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

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

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

  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 - Исключение проверки правильности

Другие вопросы по тегам