2012-10-11 75 views
2

我有一个使用Selenium WebDriver进行C#单元测试来测试链接是否存在。下面的代码:MSTest单元测试 - 处理异常

[TestMethod()] 
    public void RegisterLinkExistTest() 
    { 
     IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1")); 
     Assert.AreEqual("Register here", registerLink.Text, "Failed"); 
    } 

我想看看,如果我设置PartialLinkText为“寄存器1”,而不是“注册”会发生什么。 MSTest通过Selenium抛出的异常未通过此测试。我希望Assert.AreEqual执行,但MSTest在前一行中引发异常。我知道我可以使用ExpectedException属性来指定“OpenQA.Selenium.NoSuchElementException”,但我不想这样做,因为我不期待这种异常。我该如何处理这个问题?

+1

尚不清楚,你显然知道它不应该存在,因此你会得到一个例外。因此,测试的行为如预期。 –

+0

我不希望MSTest在这种情况下抛出未处理的异常。例如,如果我正在寻找一个正确的“注册”链接,并且该网站没有这个链接,我将如何让代码不会抛出未处理的异常,而是执行Assert语句? – user1739627

回答

1

由于@ AD.Net已经说过,您的测试工作正常。

如果没有找到链接,您可以捕获异常,但我没有看到这一点。如果未找到链接,则registerLink将为null。在空对象的属性上声明有什么意义?

您的测试工作正常,只需删除Assert行。

但是,如果你也想测试链接的文本试试下面的代码:

[TestMethod()] 
public void RegisterLinkExistTest() 
{ 
    try 
    { 
     IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1")); 
     Assert.AreEqual("Register here", registerLink.Text, "Register's link text mismatch"); 
    } 
    catch(NoSuchElementException) 
    { 
     Assert.Fail("The register link was not found"); 
    } 
} 

编辑

你可以单独测试,如果该链接存在的第一个测试将检查和第二个将声明它的属性。

[TestMethod()] 
public void RegisterLinkExistTest() 
{ 
    IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1")); 
} 

[TestMethod()] 
public void RegisterLinkTextTest() 
{ 
    IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1")); 
    Assert.AreEqual("Register here", registerLink.Text, "Register's link text mismatch"); 
} 

然后使用OrderedTest,并依次将它们添加这样RegisterLinkExistTest将首先执行。如果失败,那么第二次测试将不会运行。

+0

优秀的回复。但是,一个简单的问题。我已阅读文章,不建议添加try ... catch块到单元测试。话虽如此,我可以检查FindElement方法是否返回null,然后执行Assert.Fail? – user1739627

+0

嗯,起初,我认为你的测试不是单元测试,而是自动GUI测试。 FindElement方法永远不会返回null,如果找不到链接,它总是会抛出异常。你可以做的是分开两个测试,第一个将检查链接是否存在,第二个将会断言它的属性。然后使用[OrderedTest](http://msdn.microsoft.com/en-us/library/ms182631(v = vs.100).aspx)一个接一个地执行它们。如果第一次失败,第二次将不会被执行。如果你想了解更多的细节,我可以在我的答案中发布它。 – Schaliasos

+0

感谢您的回复。请张贴您的答案。 – user1739627