2008-10-22 5 views
9

Я использую Microsoft WebTest и хочу иметь возможность делать что-то похожее на Assert.Fail() NUnit. Лучшее, что я придумал, это throw new webTestException(), но это показывает в результатах теста как Error, а не Failure.Как я могу выйти из веб-теста?

За исключением отражения на WebTest для установки переменной частного члена, указывающей на сбой, есть ли что-то, что я пропустил?

EDIT: Я также использовал метод Assert.Fail(), но это все еще отображается как ошибка, а не сбой при использовании из WebTest, а свойство Outcome доступно только для чтения (не имеет общедоступного средства настройки).

EDIT: ну, теперь я действительно в тупике. Я использовал отражение, чтобы установить свойство Outcome в Failed, но тест еще проходит!

Вот код, который устанавливает Oucome к неуспешно:

public static class WebTestExtensions 
{ 
    public static void Fail(this WebTest test) 
    { 
     var method = test.GetType().GetMethod("set_Outcome", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(test, new object[] {Outcome.Fail}); 
    } 
} 

и вот код, который я пытаюсь терпеть неудачу:

public override IEnumerator<WebTestRequest> GetRequestEnumerator() 
    { 
     this.Fail(); 
     yield return new WebTestRequest("http://google.com"); 
    } 

Outcome становится установлен Oucome.Fail но, видимо, WebTest framework не использует это для определения результатов теста/неудачи.

ответ

2

Установите Outcome property в Сбой:

Outcome = Outcome.Fail; 

Там же в Microsoft.VisualStudio.QualityTools.UnitTestFramework сборки Assert.Fail().

+0

Если бы понятнее ... У меня было уже пробовали оба из них. (отредактированный вопрос, чтобы это отразить) – craigb 2008-10-22 14:08:22

1

Свойство Результат будет установлен общественности на VSTS 2010 :-)

1

Как насчет:

Assert.IsTrue(false); 

Я не проверил это, так что можно было бы доносили как ошибка просто как Assert.Fail(), и я согласен, что это взломать. Но поскольку Assert.Fail(), похоже, не работает так, как вы ожидаете, и не устанавливает значение «Результат», я не вижу другого выбора.

1

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

public class FailValidationRule : ValidationRule 
{ 
    public override void Validate(object sender, ValidationEventArgs e) 
    { 
     e.IsValid = false; 
    } 
} 

Затем присоединить новое правило проверки вы ValidateResponse событие вашей WebTest, как и так:

public class CodedWebTest : WebTest 
{ 
    public override IEnumerator<WebTestRequest> GetRequestEnumerator() 
    { 
     WebTestRequest request1 = new WebTestRequest("http://www.google.com"); 
     FailValidationRule failValidation = new FailValidationRule(); 
     request1.ValidateResponse += new EventHandler<ValidationEventArgs>(failValidation.Validate); 
     yield return request1; 
    } 
} 
0

Установите значение Результата в PostWebTest обработчик события.

1

Решение, которое будет работать в декларативных тестах (а также закодированы) является:

  • написать Validation Rule, который не когда определенный контекст параметра (например,«FAIL») присутствует в Контексте
  • , когда вы хотите вызвать сбой, установите параметр контекста и вызовите WebTest.Stop()
  • добавьте правило проверки как правило уровня WebTest (не на уровне запроса) так что он работает по всем запросам

Я думаю, что это так лаконично, как это можно сделать.

1

Во-первых, я работаю с VB.net, но я также попытался свести исход к ошибке, прежде чем выяснять, что он не работает (что привело меня сюда).

я, наконец, удалось сделать это, просто бросая исключение:

Public Overrides Sub PostRequest(ByVal sender As Object, ByVal e As PostRequestEventArgs) 

    If YourTest = True Then 

     Throw New WebTestException("My test Failed") 

    End If 

    MyBase.PostRequest(sender, e) 

    End Sub 

Я знаю, что эта тема старая, но я надеюсь, что это поможет кому-то в любом случае :)

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