2015-08-24 29 views
1

我有一个窗口窗体和一个按钮,我试图用codedUitest来测试它。如果引发任何异常,我希望测试失败,但在测试类中它不会捕获异常。如何捕获由另一个类抛出的测试类中的异常?

这里是我的代码:

public void button1_Click(object sender, EventArgs e) 
{ 
    double[] dummy = new double[1]; 
    int i = 1; 

    if (i > 0) 
    { 
     throw new System.IndexOutOfRangeException("index parameter is out of range.");  
    } 
    else 
    {    
     dummy[i] = 6; 
    } 
} 

的测试方法是:

public void CodedUITestMethod1() 
{ 
    try 
    { 
     this.UIMap.TryBtn1(); 
    } 
    catch (IndexOutOfRangeException) 
    { 
     Assert.Fail(); 
    } 
} 
+2

看到这个帖子在单位醒目异常测试 http://stackoverflow.com/questions/933613/how-do-i-use-assert-to-verify-that-an-exception-has-been-抛出 – Prashant

+0

你使用什么单元测试框架? – xeraphim

+0

http://stackoverflow.com/questions/8381042/catch-an-exception-thrown-by-another-form是好的,但我想在应用程序中使用它包含很多方法,它没有意义添加每个方法的try catch块,我使用.NET框架4.5 –

回答

0

你写一个集成测试。

免责声明:我是一个网页开发人员 - 所以我必须假设这和使用像selenium这样的浏览器驱动程序相似。

所以你在做什么是告诉UI驱动程序点击按钮。这运行的代码,但它不会在测试环境运行它。您的测试只能访问UI。

为了检测错误是否已经被抛出,我想你将不得不检查UI来查看弹出窗口是否已经出现。

如果你想测试的方法(这可能是最好的取决于你的情况),你可以使用NUnit和Moq。

using System; 
using Moq; 
using NUnit.Framework; 

namespace Tests 
{ 
    [TestFixture] 
    class Tests 
    { 
     [Test] 
     public void Throws() 
     { 
      var sender = new Mock<object>(); 
      var args = new Mock<EventArgs>(); 

      Assert.Throws<IndexOutOfRangeException>(() => button1_Click(sender.Object, args.Object)); 
     } 

     public void button1_Click(object sender, EventArgs e) 
     { 
      double[] dummy = new double[1]; 
      int i = 1; 

      if (i > 0) 
      { 

       throw new System.IndexOutOfRangeException("index parameter is out of range."); 
      } 
      else 
      { 
       dummy[i] = 6; 
      } 

     } 
    } 
} 
0

您可以将[ExpectedException(typeof(IndexOutOfRangeException))]属性添加到您的TestMethod。看看MSTest Exception Handling