如何通过WebTest失败?

时间:2008-10-22 04:11:25

标签: c# unit-testing mstest webtest

我正在使用Microsoft WebTest,并希望能够执行与NUnit Assert.Fail()类似的操作。我提出的最好的是throw new webTestException(),但这在测试结果中显示为Error而不是Failure

除了反映WebTest设置私有成员变量以指示失败之外,还有一些我错过了吗?

编辑:我也使用了Assert.Fail()方法,但是当从WebTest中使用时,这仍然显示为错误而不是失败,Outcome属性是只读的(没有)公共制定者)。

编辑:好吧,现在我真的很难过。我使用反射将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框架并不真正使用它来确定测试通过/未通过结果。

6 个答案:

答案 0 :(得分:2)

Outcome property设置为失败

Outcome = Outcome.Fail;

Microsoft.VisualStudio.QualityTools.UnitTestFramework 程序集中还有一个Assert.Fail()

答案 1 :(得分:1)

Outcome属性将在2010年的版本中设置公众: - )

答案 2 :(得分:1)

通过添加始终失败的验证规则,您始终会使测试失败。例如,您可以编写如下的失败验证规则:

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

然后将新验证规则附加到webtest的ValidateResponse事件中,如下所示:

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;
    }
}

答案 3 :(得分:1)

在声明性测试(以及编码)中起作用的解决方案是:

  • 编写在上下文中存在某个上下文参数(例如“FAIL”)时失败的验证规则
  • 如果要触发失败,请设置上下文参数并调用WebTest.Stop()
  • 将验证规则添加为WebTest级别规则(不是请求级别),以便它可以在所有请求上运行

我认为这是可以做到的简洁。

答案 4 :(得分: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

我知道这个话题已经过时了,但我希望它能帮助某人:)

答案 5 :(得分:0)

在PostWebTest事件处理程序中设置Outcome的值。