asp.net写单元测试返回Exception

时间:2011-08-23 09:46:30

标签: asp.net unit-testing

我有一个像这样启动的Repositry类:

public ContactRepository(string sqlStr, string username)
{
    if (!string.IsNullOrEmpty(sqlStr))
    {
        ent = new AceoEntities(sqlStr);
        Username = username; 
    }
    else
        new Exception("No sql string is defined");
}

这可能不是最好的方法,但我想确保在没有sqlStr的情况下在类外创建实例是不可能的。

然后我试着测试一下:

[TestMethod()]
public void CreateContactRepositoryWithEmtySqlString()
{
    string sqlStr = string.Empty;
    ContactRepository target;

    try
    {
        target = new ContactRepository("kvelland-kk", sqlStr);
    }
    catch (Exception e)
    {
        Assert.AreEqual("No sql string is defined",e.Message);
    }
}

我的问题是:这是正确的方法吗?我在解决这个问题时遇到了问题。

3 个答案:

答案 0 :(得分:3)

我宁愿使用ExpectedException属性来标记TestMethod,并抛出更具体的异常类型,例如ArgumentException:

[TestMethod()]
[ExpectedException(typeof(System.ArgumentException))]
public void CreateContactRepositoryWithEmtySqlString()
{
    ContactRepository target = new ContactRepository("kvelland-kk", string.Empty);
}

答案 1 :(得分:0)

你忘了抛出新的例外

抛出新的异常(“没有定义sql字符串”);

有趣的是,这种情况证明了单元测试的价值,因为它们很容易就会显示出一个简单的编码错误。

答案 2 :(得分:0)

我更喜欢GarethOwen的答案(ExpectedException属性)或这样:

public void MyTest()
{
    try
    {    
        target = new ContactRepository("kvelland-kk", sqlStr); 

        Assert.Fail("Should have failed with MyExceptionType");
    }
    catch(MyExceptionType){}
}

检查异常消息不是一个好主意。因为您可能会根据系统本地化获得不同的消息。请改为检查异常类型。并且正如Xhalent提到的那样,不抛出异常,抛出特定类型的异常。