我有一个像这样启动的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);
}
}
我的问题是:这是正确的方法吗?我在解决这个问题时遇到了问题。
答案 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提到的那样,不抛出异常,抛出特定类型的异常。